linux/drivers/infiniband/hw/nes/nes_cm.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2006 - 2011 Intel Corporation.  All rights reserved.
   3 *
   4 * This software is available to you under a choice of one of two
   5 * licenses.  You may choose to be licensed under the terms of the GNU
   6 * General Public License (GPL) Version 2, available from the file
   7 * COPYING in the main directory of this source tree, or the
   8 * OpenIB.org BSD license below:
   9 *
  10 *     Redistribution and use in source and binary forms, with or
  11 *     without modification, are permitted provided that the following
  12 *     conditions are met:
  13 *
  14 *      - Redistributions of source code must retain the above
  15 *        copyright notice, this list of conditions and the following
  16 *        disclaimer.
  17 *
  18 *      - Redistributions in binary form must reproduce the above
  19 *        copyright notice, this list of conditions and the following
  20 *        disclaimer in the documentation and/or other materials
  21 *        provided with the distribution.
  22 *
  23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  30 * SOFTWARE.
  31 *
  32 */
  33
  34
  35#define TCPOPT_TIMESTAMP 8
  36
  37#include <linux/atomic.h>
  38#include <linux/skbuff.h>
  39#include <linux/ip.h>
  40#include <linux/tcp.h>
  41#include <linux/init.h>
  42#include <linux/if_arp.h>
  43#include <linux/if_vlan.h>
  44#include <linux/notifier.h>
  45#include <linux/net.h>
  46#include <linux/types.h>
  47#include <linux/timer.h>
  48#include <linux/time.h>
  49#include <linux/delay.h>
  50#include <linux/etherdevice.h>
  51#include <linux/netdevice.h>
  52#include <linux/random.h>
  53#include <linux/list.h>
  54#include <linux/threads.h>
  55#include <linux/highmem.h>
  56#include <linux/slab.h>
  57#include <net/arp.h>
  58#include <net/neighbour.h>
  59#include <net/route.h>
  60#include <net/ip_fib.h>
  61#include <net/tcp.h>
  62
  63#include "nes.h"
  64
  65u32 cm_packets_sent;
  66u32 cm_packets_bounced;
  67u32 cm_packets_dropped;
  68u32 cm_packets_retrans;
  69u32 cm_packets_created;
  70u32 cm_packets_received;
  71atomic_t cm_listens_created;
  72atomic_t cm_listens_destroyed;
  73u32 cm_backlog_drops;
  74atomic_t cm_loopbacks;
  75atomic_t cm_nodes_created;
  76atomic_t cm_nodes_destroyed;
  77atomic_t cm_accel_dropped_pkts;
  78atomic_t cm_resets_recvd;
  79
  80static inline int mini_cm_accelerated(struct nes_cm_core *, struct nes_cm_node *);
  81static struct nes_cm_listener *mini_cm_listen(struct nes_cm_core *, struct nes_vnic *, struct nes_cm_info *);
  82static int mini_cm_del_listen(struct nes_cm_core *, struct nes_cm_listener *);
  83static struct nes_cm_node *mini_cm_connect(struct nes_cm_core *, struct nes_vnic *, u16, void *, struct nes_cm_info *);
  84static int mini_cm_close(struct nes_cm_core *, struct nes_cm_node *);
  85static int mini_cm_accept(struct nes_cm_core *, struct nes_cm_node *);
  86static int mini_cm_reject(struct nes_cm_core *, struct nes_cm_node *);
  87static int mini_cm_recv_pkt(struct nes_cm_core *, struct nes_vnic *, struct sk_buff *);
  88static int mini_cm_dealloc_core(struct nes_cm_core *);
  89static int mini_cm_get(struct nes_cm_core *);
  90static int mini_cm_set(struct nes_cm_core *, u32, u32);
  91
  92static void form_cm_frame(struct sk_buff *, struct nes_cm_node *, void *, u32, void *, u32, u8);
  93static int add_ref_cm_node(struct nes_cm_node *);
  94static int rem_ref_cm_node(struct nes_cm_core *, struct nes_cm_node *);
  95
  96static int nes_cm_disconn_true(struct nes_qp *);
  97static int nes_cm_post_event(struct nes_cm_event *event);
  98static int nes_disconnect(struct nes_qp *nesqp, int abrupt);
  99static void nes_disconnect_worker(struct work_struct *work);
 100
 101static int send_mpa_request(struct nes_cm_node *, struct sk_buff *);
 102static int send_mpa_reject(struct nes_cm_node *);
 103static int send_syn(struct nes_cm_node *, u32, struct sk_buff *);
 104static int send_reset(struct nes_cm_node *, struct sk_buff *);
 105static int send_ack(struct nes_cm_node *cm_node, struct sk_buff *skb);
 106static int send_fin(struct nes_cm_node *cm_node, struct sk_buff *skb);
 107static void process_packet(struct nes_cm_node *, struct sk_buff *, struct nes_cm_core *);
 108
 109static void active_open_err(struct nes_cm_node *, struct sk_buff *, int);
 110static void passive_open_err(struct nes_cm_node *, struct sk_buff *, int);
 111static void cleanup_retrans_entry(struct nes_cm_node *);
 112static void handle_rcv_mpa(struct nes_cm_node *, struct sk_buff *);
 113static void free_retrans_entry(struct nes_cm_node *cm_node);
 114static int handle_tcp_options(struct nes_cm_node *cm_node, struct tcphdr *tcph, struct sk_buff *skb, int optionsize, int passive);
 115
 116/* CM event handler functions */
 117static void cm_event_connected(struct nes_cm_event *);
 118static void cm_event_connect_error(struct nes_cm_event *);
 119static void cm_event_reset(struct nes_cm_event *);
 120static void cm_event_mpa_req(struct nes_cm_event *);
 121static void cm_event_mpa_reject(struct nes_cm_event *);
 122static void handle_recv_entry(struct nes_cm_node *cm_node, u32 rem_node);
 123
 124/* MPA build functions */
 125static int cm_build_mpa_frame(struct nes_cm_node *, u8 **, u16 *, u8 *, u8);
 126static void build_mpa_v2(struct nes_cm_node *, void *, u8);
 127static void build_mpa_v1(struct nes_cm_node *, void *, u8);
 128static void build_rdma0_msg(struct nes_cm_node *, struct nes_qp **);
 129
 130static void print_core(struct nes_cm_core *core);
 131
 132/* External CM API Interface */
 133/* instance of function pointers for client API */
 134/* set address of this instance to cm_core->cm_ops at cm_core alloc */
 135static struct nes_cm_ops nes_cm_api = {
 136        mini_cm_accelerated,
 137        mini_cm_listen,
 138        mini_cm_del_listen,
 139        mini_cm_connect,
 140        mini_cm_close,
 141        mini_cm_accept,
 142        mini_cm_reject,
 143        mini_cm_recv_pkt,
 144        mini_cm_dealloc_core,
 145        mini_cm_get,
 146        mini_cm_set
 147};
 148
 149static struct nes_cm_core *g_cm_core;
 150
 151atomic_t cm_connects;
 152atomic_t cm_accepts;
 153atomic_t cm_disconnects;
 154atomic_t cm_closes;
 155atomic_t cm_connecteds;
 156atomic_t cm_connect_reqs;
 157atomic_t cm_rejects;
 158
 159int nes_add_ref_cm_node(struct nes_cm_node *cm_node)
 160{
 161        return add_ref_cm_node(cm_node);
 162}
 163
 164int nes_rem_ref_cm_node(struct nes_cm_node *cm_node)
 165{
 166        return rem_ref_cm_node(cm_node->cm_core, cm_node);
 167}
 168
 169/**
 170 * create_event
 171 */
 172static struct nes_cm_event *create_event(struct nes_cm_node *   cm_node,
 173                                         enum nes_cm_event_type type)
 174{
 175        struct nes_cm_event *event;
 176
 177        if (!cm_node->cm_id)
 178                return NULL;
 179
 180        /* allocate an empty event */
 181        event = kzalloc(sizeof(*event), GFP_ATOMIC);
 182
 183        if (!event)
 184                return NULL;
 185
 186        event->type = type;
 187        event->cm_node = cm_node;
 188        event->cm_info.rem_addr = cm_node->rem_addr;
 189        event->cm_info.loc_addr = cm_node->loc_addr;
 190        event->cm_info.rem_port = cm_node->rem_port;
 191        event->cm_info.loc_port = cm_node->loc_port;
 192        event->cm_info.cm_id = cm_node->cm_id;
 193
 194        nes_debug(NES_DBG_CM, "cm_node=%p Created event=%p, type=%u, "
 195                  "dst_addr=%08x[%x], src_addr=%08x[%x]\n",
 196                  cm_node, event, type, event->cm_info.loc_addr,
 197                  event->cm_info.loc_port, event->cm_info.rem_addr,
 198                  event->cm_info.rem_port);
 199
 200        nes_cm_post_event(event);
 201        return event;
 202}
 203
 204
 205/**
 206 * send_mpa_request
 207 */
 208static int send_mpa_request(struct nes_cm_node *cm_node, struct sk_buff *skb)
 209{
 210        u8 start_addr = 0;
 211        u8 *start_ptr = &start_addr;
 212        u8 **start_buff = &start_ptr;
 213        u16 buff_len = 0;
 214
 215        if (!skb) {
 216                nes_debug(NES_DBG_CM, "skb set to NULL\n");
 217                return -1;
 218        }
 219
 220        /* send an MPA Request frame */
 221        cm_build_mpa_frame(cm_node, start_buff, &buff_len, NULL, MPA_KEY_REQUEST);
 222        form_cm_frame(skb, cm_node, NULL, 0, *start_buff, buff_len, SET_ACK);
 223
 224        return schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 1, 0);
 225}
 226
 227
 228
 229static int send_mpa_reject(struct nes_cm_node *cm_node)
 230{
 231        struct sk_buff *skb = NULL;
 232        u8 start_addr = 0;
 233        u8 *start_ptr = &start_addr;
 234        u8 **start_buff = &start_ptr;
 235        u16 buff_len = 0;
 236        struct ietf_mpa_v1 *mpa_frame;
 237
 238        skb = dev_alloc_skb(MAX_CM_BUFFER);
 239        if (!skb) {
 240                nes_debug(NES_DBG_CM, "Failed to get a Free pkt\n");
 241                return -ENOMEM;
 242        }
 243
 244        /* send an MPA reject frame */
 245        cm_build_mpa_frame(cm_node, start_buff, &buff_len, NULL, MPA_KEY_REPLY);
 246        mpa_frame = (struct ietf_mpa_v1 *)*start_buff;
 247        mpa_frame->flags |= IETF_MPA_FLAGS_REJECT;
 248        form_cm_frame(skb, cm_node, NULL, 0, *start_buff, buff_len, SET_ACK | SET_FIN);
 249
 250        cm_node->state = NES_CM_STATE_FIN_WAIT1;
 251        return schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 1, 0);
 252}
 253
 254
 255/**
 256 * recv_mpa - process a received TCP pkt, we are expecting an
 257 * IETF MPA frame
 258 */
 259static int parse_mpa(struct nes_cm_node *cm_node, u8 *buffer, u32 *type,
 260                     u32 len)
 261{
 262        struct ietf_mpa_v1 *mpa_frame;
 263        struct ietf_mpa_v2 *mpa_v2_frame;
 264        struct ietf_rtr_msg *rtr_msg;
 265        int mpa_hdr_len;
 266        int priv_data_len;
 267
 268        *type = NES_MPA_REQUEST_ACCEPT;
 269
 270        /* assume req frame is in tcp data payload */
 271        if (len < sizeof(struct ietf_mpa_v1)) {
 272                nes_debug(NES_DBG_CM, "The received ietf buffer was too small (%x)\n", len);
 273                return -EINVAL;
 274        }
 275
 276        /* points to the beginning of the frame, which could be MPA V1 or V2 */
 277        mpa_frame = (struct ietf_mpa_v1 *)buffer;
 278        mpa_hdr_len = sizeof(struct ietf_mpa_v1);
 279        priv_data_len = ntohs(mpa_frame->priv_data_len);
 280
 281        /* make sure mpa private data len is less than 512 bytes */
 282        if (priv_data_len > IETF_MAX_PRIV_DATA_LEN) {
 283                nes_debug(NES_DBG_CM, "The received Length of Private"
 284                          " Data field exceeds 512 octets\n");
 285                return -EINVAL;
 286        }
 287        /*
 288         * make sure MPA receiver interoperate with the
 289         * received MPA version and MPA key information
 290         *
 291         */
 292        if (mpa_frame->rev != IETF_MPA_V1 && mpa_frame->rev != IETF_MPA_V2) {
 293                nes_debug(NES_DBG_CM, "The received mpa version"
 294                          " is not supported\n");
 295                return -EINVAL;
 296        }
 297        /*
 298        * backwards compatibility only
 299        */
 300        if (mpa_frame->rev > cm_node->mpa_frame_rev) {
 301                nes_debug(NES_DBG_CM, "The received mpa version"
 302                        " can not be interoperated\n");
 303                return -EINVAL;
 304        } else {
 305                cm_node->mpa_frame_rev = mpa_frame->rev;
 306        }
 307
 308        if (cm_node->state != NES_CM_STATE_MPAREQ_SENT) {
 309                if (memcmp(mpa_frame->key, IEFT_MPA_KEY_REQ, IETF_MPA_KEY_SIZE)) {
 310                        nes_debug(NES_DBG_CM, "Unexpected MPA Key received \n");
 311                        return -EINVAL;
 312                }
 313        } else {
 314                if (memcmp(mpa_frame->key, IEFT_MPA_KEY_REP, IETF_MPA_KEY_SIZE)) {
 315                        nes_debug(NES_DBG_CM, "Unexpected MPA Key received \n");
 316                        return -EINVAL;
 317                }
 318        }
 319
 320
 321        if (priv_data_len + mpa_hdr_len != len) {
 322                nes_debug(NES_DBG_CM, "The received ietf buffer was not right"
 323                        " complete (%x + %x != %x)\n",
 324                        priv_data_len, mpa_hdr_len, len);
 325                return -EINVAL;
 326        }
 327        /* make sure it does not exceed the max size */
 328        if (len > MAX_CM_BUFFER) {
 329                nes_debug(NES_DBG_CM, "The received ietf buffer was too large"
 330                        " (%x + %x != %x)\n",
 331                        priv_data_len, mpa_hdr_len, len);
 332                return -EINVAL;
 333        }
 334
 335        cm_node->mpa_frame_size = priv_data_len;
 336
 337        switch (mpa_frame->rev) {
 338        case IETF_MPA_V2: {
 339                u16 ird_size;
 340                u16 ord_size;
 341                u16 rtr_ctrl_ird;
 342                u16 rtr_ctrl_ord;
 343
 344                mpa_v2_frame = (struct ietf_mpa_v2 *)buffer;
 345                mpa_hdr_len += IETF_RTR_MSG_SIZE;
 346                cm_node->mpa_frame_size -= IETF_RTR_MSG_SIZE;
 347                rtr_msg = &mpa_v2_frame->rtr_msg;
 348
 349                /* parse rtr message */
 350                rtr_ctrl_ird = ntohs(rtr_msg->ctrl_ird);
 351                rtr_ctrl_ord = ntohs(rtr_msg->ctrl_ord);
 352                ird_size = rtr_ctrl_ird & IETF_NO_IRD_ORD;
 353                ord_size = rtr_ctrl_ord & IETF_NO_IRD_ORD;
 354
 355                if (!(rtr_ctrl_ird & IETF_PEER_TO_PEER)) {
 356                        /* send reset */
 357                        return -EINVAL;
 358                }
 359
 360                if (cm_node->state != NES_CM_STATE_MPAREQ_SENT) {
 361                        /* responder */
 362                        if (cm_node->ord_size > ird_size)
 363                                cm_node->ord_size = ird_size;
 364                } else {
 365                        /* initiator */
 366                        if (cm_node->ord_size > ird_size)
 367                                cm_node->ord_size = ird_size;
 368
 369                        if (cm_node->ird_size < ord_size) {
 370                                /* no resources available */
 371                                /* send terminate message */
 372                                return -EINVAL;
 373                        }
 374                }
 375
 376                if (rtr_ctrl_ord & IETF_RDMA0_READ) {
 377                        cm_node->send_rdma0_op = SEND_RDMA_READ_ZERO;
 378                } else if (rtr_ctrl_ord & IETF_RDMA0_WRITE) {
 379                        cm_node->send_rdma0_op = SEND_RDMA_WRITE_ZERO;
 380                } else {        /* Not supported RDMA0 operation */
 381                        return -EINVAL;
 382                }
 383                break;
 384        }
 385        case IETF_MPA_V1:
 386        default:
 387                break;
 388        }
 389
 390        /* copy entire MPA frame to our cm_node's frame */
 391        memcpy(cm_node->mpa_frame_buf, buffer + mpa_hdr_len, cm_node->mpa_frame_size);
 392
 393        if (mpa_frame->flags & IETF_MPA_FLAGS_REJECT)
 394                *type = NES_MPA_REQUEST_REJECT;
 395        return 0;
 396}
 397
 398
 399/**
 400 * form_cm_frame - get a free packet and build empty frame Use
 401 * node info to build.
 402 */
 403static void form_cm_frame(struct sk_buff *skb,
 404                          struct nes_cm_node *cm_node, void *options, u32 optionsize,
 405                          void *data, u32 datasize, u8 flags)
 406{
 407        struct tcphdr *tcph;
 408        struct iphdr *iph;
 409        struct ethhdr *ethh;
 410        u8 *buf;
 411        u16 packetsize = sizeof(*iph);
 412
 413        packetsize += sizeof(*tcph);
 414        packetsize += optionsize + datasize;
 415
 416        skb_trim(skb, 0);
 417        memset(skb->data, 0x00, ETH_HLEN + sizeof(*iph) + sizeof(*tcph));
 418
 419        buf = skb_put(skb, packetsize + ETH_HLEN);
 420
 421        ethh = (struct ethhdr *)buf;
 422        buf += ETH_HLEN;
 423
 424        iph = (struct iphdr *)buf;
 425        buf += sizeof(*iph);
 426        tcph = (struct tcphdr *)buf;
 427        skb_reset_mac_header(skb);
 428        skb_set_network_header(skb, ETH_HLEN);
 429        skb_set_transport_header(skb, ETH_HLEN + sizeof(*iph));
 430        buf += sizeof(*tcph);
 431
 432        skb->ip_summed = CHECKSUM_PARTIAL;
 433        if (!(cm_node->netdev->features & NETIF_F_IP_CSUM))
 434                skb->ip_summed = CHECKSUM_NONE;
 435        skb->protocol = htons(0x800);
 436        skb->data_len = 0;
 437        skb->mac_len = ETH_HLEN;
 438
 439        memcpy(ethh->h_dest, cm_node->rem_mac, ETH_ALEN);
 440        memcpy(ethh->h_source, cm_node->loc_mac, ETH_ALEN);
 441        ethh->h_proto = htons(0x0800);
 442
 443        iph->version = IPVERSION;
 444        iph->ihl = 5;           /* 5 * 4Byte words, IP headr len */
 445        iph->tos = 0;
 446        iph->tot_len = htons(packetsize);
 447        iph->id = htons(++cm_node->tcp_cntxt.loc_id);
 448
 449        iph->frag_off = htons(0x4000);
 450        iph->ttl = 0x40;
 451        iph->protocol = 0x06;   /* IPPROTO_TCP */
 452
 453        iph->saddr = htonl(cm_node->loc_addr);
 454        iph->daddr = htonl(cm_node->rem_addr);
 455
 456        tcph->source = htons(cm_node->loc_port);
 457        tcph->dest = htons(cm_node->rem_port);
 458        tcph->seq = htonl(cm_node->tcp_cntxt.loc_seq_num);
 459
 460        if (flags & SET_ACK) {
 461                cm_node->tcp_cntxt.loc_ack_num = cm_node->tcp_cntxt.rcv_nxt;
 462                tcph->ack_seq = htonl(cm_node->tcp_cntxt.loc_ack_num);
 463                tcph->ack = 1;
 464        } else {
 465                tcph->ack_seq = 0;
 466        }
 467
 468        if (flags & SET_SYN) {
 469                cm_node->tcp_cntxt.loc_seq_num++;
 470                tcph->syn = 1;
 471        } else {
 472                cm_node->tcp_cntxt.loc_seq_num += datasize;
 473        }
 474
 475        if (flags & SET_FIN) {
 476                cm_node->tcp_cntxt.loc_seq_num++;
 477                tcph->fin = 1;
 478        }
 479
 480        if (flags & SET_RST)
 481                tcph->rst = 1;
 482
 483        tcph->doff = (u16)((sizeof(*tcph) + optionsize + 3) >> 2);
 484        tcph->window = htons(cm_node->tcp_cntxt.rcv_wnd);
 485        tcph->urg_ptr = 0;
 486        if (optionsize)
 487                memcpy(buf, options, optionsize);
 488        buf += optionsize;
 489        if (datasize)
 490                memcpy(buf, data, datasize);
 491
 492        skb_shinfo(skb)->nr_frags = 0;
 493        cm_packets_created++;
 494}
 495
 496/**
 497 * print_core - dump a cm core
 498 */
 499static void print_core(struct nes_cm_core *core)
 500{
 501        nes_debug(NES_DBG_CM, "---------------------------------------------\n");
 502        nes_debug(NES_DBG_CM, "CM Core  -- (core = %p )\n", core);
 503        if (!core)
 504                return;
 505        nes_debug(NES_DBG_CM, "---------------------------------------------\n");
 506
 507        nes_debug(NES_DBG_CM, "State         : %u \n", core->state);
 508
 509        nes_debug(NES_DBG_CM, "Listen Nodes  : %u \n", atomic_read(&core->listen_node_cnt));
 510        nes_debug(NES_DBG_CM, "Active Nodes  : %u \n", atomic_read(&core->node_cnt));
 511
 512        nes_debug(NES_DBG_CM, "core          : %p \n", core);
 513
 514        nes_debug(NES_DBG_CM, "-------------- end core ---------------\n");
 515}
 516
 517/**
 518 * cm_build_mpa_frame - build a MPA V1 frame or MPA V2 frame
 519 */
 520static int cm_build_mpa_frame(struct nes_cm_node *cm_node, u8 **start_buff,
 521                              u16 *buff_len, u8 *pci_mem, u8 mpa_key)
 522{
 523        int ret = 0;
 524
 525        *start_buff = (pci_mem) ? pci_mem : &cm_node->mpa_frame_buf[0];
 526
 527        switch (cm_node->mpa_frame_rev) {
 528        case IETF_MPA_V1:
 529                *start_buff = (u8 *)*start_buff + sizeof(struct ietf_rtr_msg);
 530                *buff_len = sizeof(struct ietf_mpa_v1) + cm_node->mpa_frame_size;
 531                build_mpa_v1(cm_node, *start_buff, mpa_key);
 532                break;
 533        case IETF_MPA_V2:
 534                *buff_len = sizeof(struct ietf_mpa_v2) + cm_node->mpa_frame_size;
 535                build_mpa_v2(cm_node, *start_buff, mpa_key);
 536                break;
 537        default:
 538                ret = -EINVAL;
 539        }
 540        return ret;
 541}
 542
 543/**
 544 * build_mpa_v2 - build a MPA V2 frame
 545 */
 546static void build_mpa_v2(struct nes_cm_node *cm_node,
 547                         void *start_addr, u8 mpa_key)
 548{
 549        struct ietf_mpa_v2 *mpa_frame = (struct ietf_mpa_v2 *)start_addr;
 550        struct ietf_rtr_msg *rtr_msg = &mpa_frame->rtr_msg;
 551        u16 ctrl_ird;
 552        u16 ctrl_ord;
 553
 554        /* initialize the upper 5 bytes of the frame */
 555        build_mpa_v1(cm_node, start_addr, mpa_key);
 556        mpa_frame->flags |= IETF_MPA_V2_FLAG; /* set a bit to indicate MPA V2 */
 557        mpa_frame->priv_data_len += htons(IETF_RTR_MSG_SIZE);
 558
 559        /* initialize RTR msg */
 560        ctrl_ird = (cm_node->ird_size > IETF_NO_IRD_ORD) ?
 561                            IETF_NO_IRD_ORD : cm_node->ird_size;
 562        ctrl_ord = (cm_node->ord_size > IETF_NO_IRD_ORD) ?
 563                            IETF_NO_IRD_ORD : cm_node->ord_size;
 564
 565        ctrl_ird |= IETF_PEER_TO_PEER;
 566        ctrl_ird |= IETF_FLPDU_ZERO_LEN;
 567
 568        switch (mpa_key) {
 569        case MPA_KEY_REQUEST:
 570                ctrl_ord |= IETF_RDMA0_WRITE;
 571                ctrl_ord |= IETF_RDMA0_READ;
 572                break;
 573        case MPA_KEY_REPLY:
 574                switch (cm_node->send_rdma0_op) {
 575                case SEND_RDMA_WRITE_ZERO:
 576                        ctrl_ord |= IETF_RDMA0_WRITE;
 577                        break;
 578                case SEND_RDMA_READ_ZERO:
 579                        ctrl_ord |= IETF_RDMA0_READ;
 580                        break;
 581                }
 582        }
 583        rtr_msg->ctrl_ird = htons(ctrl_ird);
 584        rtr_msg->ctrl_ord = htons(ctrl_ord);
 585}
 586
 587/**
 588 * build_mpa_v1 - build a MPA V1 frame
 589 */
 590static void build_mpa_v1(struct nes_cm_node *cm_node, void *start_addr, u8 mpa_key)
 591{
 592        struct ietf_mpa_v1 *mpa_frame = (struct ietf_mpa_v1 *)start_addr;
 593
 594        switch (mpa_key) {
 595        case MPA_KEY_REQUEST:
 596                memcpy(mpa_frame->key, IEFT_MPA_KEY_REQ, IETF_MPA_KEY_SIZE);
 597                break;
 598        case MPA_KEY_REPLY:
 599                memcpy(mpa_frame->key, IEFT_MPA_KEY_REP, IETF_MPA_KEY_SIZE);
 600                break;
 601        }
 602        mpa_frame->flags = IETF_MPA_FLAGS_CRC;
 603        mpa_frame->rev = cm_node->mpa_frame_rev;
 604        mpa_frame->priv_data_len = htons(cm_node->mpa_frame_size);
 605}
 606
 607static void build_rdma0_msg(struct nes_cm_node *cm_node, struct nes_qp **nesqp_addr)
 608{
 609        u64 u64temp;
 610        struct nes_qp *nesqp = *nesqp_addr;
 611        struct nes_hw_qp_wqe *wqe = &nesqp->hwqp.sq_vbase[0];
 612
 613        u64temp = (unsigned long)nesqp;
 614        u64temp |= NES_SW_CONTEXT_ALIGN >> 1;
 615        set_wqe_64bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_COMP_CTX_LOW_IDX, u64temp);
 616
 617        wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_LOW_IDX] = 0;
 618        wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_HIGH_IDX] = 0;
 619
 620        switch (cm_node->send_rdma0_op) {
 621        case SEND_RDMA_WRITE_ZERO:
 622                nes_debug(NES_DBG_CM, "Sending first write.\n");
 623                wqe->wqe_words[NES_IWARP_SQ_WQE_MISC_IDX] =
 624                        cpu_to_le32(NES_IWARP_SQ_OP_RDMAW);
 625                wqe->wqe_words[NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX] = 0;
 626                wqe->wqe_words[NES_IWARP_SQ_WQE_LENGTH0_IDX] = 0;
 627                wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = 0;
 628                break;
 629
 630        case SEND_RDMA_READ_ZERO:
 631        default:
 632                if (cm_node->send_rdma0_op != SEND_RDMA_READ_ZERO)
 633                        WARN(1, "Unsupported RDMA0 len operation=%u\n",
 634                             cm_node->send_rdma0_op);
 635                nes_debug(NES_DBG_CM, "Sending first rdma operation.\n");
 636                wqe->wqe_words[NES_IWARP_SQ_WQE_MISC_IDX] =
 637                        cpu_to_le32(NES_IWARP_SQ_OP_RDMAR);
 638                wqe->wqe_words[NES_IWARP_SQ_WQE_RDMA_TO_LOW_IDX] = 1;
 639                wqe->wqe_words[NES_IWARP_SQ_WQE_RDMA_TO_HIGH_IDX] = 0;
 640                wqe->wqe_words[NES_IWARP_SQ_WQE_RDMA_LENGTH_IDX] = 0;
 641                wqe->wqe_words[NES_IWARP_SQ_WQE_RDMA_STAG_IDX] = 1;
 642                wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = 1;
 643                break;
 644        }
 645
 646        if (nesqp->sq_kmapped) {
 647                nesqp->sq_kmapped = 0;
 648                kunmap(nesqp->page);
 649        }
 650
 651        /*use the reserved spot on the WQ for the extra first WQE*/
 652        nesqp->nesqp_context->ird_ord_sizes &= cpu_to_le32(~(NES_QPCONTEXT_ORDIRD_LSMM_PRESENT |
 653                                                             NES_QPCONTEXT_ORDIRD_WRPDU |
 654                                                             NES_QPCONTEXT_ORDIRD_ALSMM));
 655        nesqp->skip_lsmm = 1;
 656        nesqp->hwqp.sq_tail = 0;
 657}
 658
 659/**
 660 * schedule_nes_timer
 661 * note - cm_node needs to be protected before calling this. Encase in:
 662 *                      rem_ref_cm_node(cm_core, cm_node);add_ref_cm_node(cm_node);
 663 */
 664int schedule_nes_timer(struct nes_cm_node *cm_node, struct sk_buff *skb,
 665                       enum nes_timer_type type, int send_retrans,
 666                       int close_when_complete)
 667{
 668        unsigned long flags;
 669        struct nes_cm_core *cm_core = cm_node->cm_core;
 670        struct nes_timer_entry *new_send;
 671        int ret = 0;
 672
 673        new_send = kzalloc(sizeof(*new_send), GFP_ATOMIC);
 674        if (!new_send)
 675                return -ENOMEM;
 676
 677        /* new_send->timetosend = currenttime */
 678        new_send->retrycount = NES_DEFAULT_RETRYS;
 679        new_send->retranscount = NES_DEFAULT_RETRANS;
 680        new_send->skb = skb;
 681        new_send->timetosend = jiffies;
 682        new_send->type = type;
 683        new_send->netdev = cm_node->netdev;
 684        new_send->send_retrans = send_retrans;
 685        new_send->close_when_complete = close_when_complete;
 686
 687        if (type == NES_TIMER_TYPE_CLOSE) {
 688                new_send->timetosend += (HZ / 10);
 689                if (cm_node->recv_entry) {
 690                        kfree(new_send);
 691                        WARN_ON(1);
 692                        return -EINVAL;
 693                }
 694                cm_node->recv_entry = new_send;
 695        }
 696
 697        if (type == NES_TIMER_TYPE_SEND) {
 698                new_send->seq_num = ntohl(tcp_hdr(skb)->seq);
 699                atomic_inc(&new_send->skb->users);
 700                spin_lock_irqsave(&cm_node->retrans_list_lock, flags);
 701                cm_node->send_entry = new_send;
 702                add_ref_cm_node(cm_node);
 703                spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);
 704                new_send->timetosend = jiffies + NES_RETRY_TIMEOUT;
 705
 706                ret = nes_nic_cm_xmit(new_send->skb, cm_node->netdev);
 707                if (ret != NETDEV_TX_OK) {
 708                        nes_debug(NES_DBG_CM, "Error sending packet %p "
 709                                  "(jiffies = %lu)\n", new_send, jiffies);
 710                        new_send->timetosend = jiffies;
 711                        ret = NETDEV_TX_OK;
 712                } else {
 713                        cm_packets_sent++;
 714                        if (!send_retrans) {
 715                                cleanup_retrans_entry(cm_node);
 716                                if (close_when_complete)
 717                                        rem_ref_cm_node(cm_core, cm_node);
 718                                return ret;
 719                        }
 720                }
 721        }
 722
 723        if (!timer_pending(&cm_core->tcp_timer))
 724                mod_timer(&cm_core->tcp_timer, new_send->timetosend);
 725
 726        return ret;
 727}
 728
 729static void nes_retrans_expired(struct nes_cm_node *cm_node)
 730{
 731        struct iw_cm_id *cm_id = cm_node->cm_id;
 732        enum nes_cm_node_state state = cm_node->state;
 733        cm_node->state = NES_CM_STATE_CLOSED;
 734
 735        switch (state) {
 736        case NES_CM_STATE_SYN_RCVD:
 737        case NES_CM_STATE_CLOSING:
 738                rem_ref_cm_node(cm_node->cm_core, cm_node);
 739                break;
 740        case NES_CM_STATE_LAST_ACK:
 741        case NES_CM_STATE_FIN_WAIT1:
 742                if (cm_node->cm_id)
 743                        cm_id->rem_ref(cm_id);
 744                send_reset(cm_node, NULL);
 745                break;
 746        default:
 747                add_ref_cm_node(cm_node);
 748                send_reset(cm_node, NULL);
 749                create_event(cm_node, NES_CM_EVENT_ABORTED);
 750        }
 751}
 752
 753static void handle_recv_entry(struct nes_cm_node *cm_node, u32 rem_node)
 754{
 755        struct nes_timer_entry *recv_entry = cm_node->recv_entry;
 756        struct iw_cm_id *cm_id = cm_node->cm_id;
 757        struct nes_qp *nesqp;
 758        unsigned long qplockflags;
 759
 760        if (!recv_entry)
 761                return;
 762        nesqp = (struct nes_qp *)recv_entry->skb;
 763        if (nesqp) {
 764                spin_lock_irqsave(&nesqp->lock, qplockflags);
 765                if (nesqp->cm_id) {
 766                        nes_debug(NES_DBG_CM, "QP%u: cm_id = %p, "
 767                                  "refcount = %d: HIT A "
 768                                  "NES_TIMER_TYPE_CLOSE with something "
 769                                  "to do!!!\n", nesqp->hwqp.qp_id, cm_id,
 770                                  atomic_read(&nesqp->refcount));
 771                        nesqp->hw_tcp_state = NES_AEQE_TCP_STATE_CLOSED;
 772                        nesqp->last_aeq = NES_AEQE_AEID_RESET_SENT;
 773                        nesqp->ibqp_state = IB_QPS_ERR;
 774                        spin_unlock_irqrestore(&nesqp->lock, qplockflags);
 775                        nes_cm_disconn(nesqp);
 776                } else {
 777                        spin_unlock_irqrestore(&nesqp->lock, qplockflags);
 778                        nes_debug(NES_DBG_CM, "QP%u: cm_id = %p, "
 779                                  "refcount = %d: HIT A "
 780                                  "NES_TIMER_TYPE_CLOSE with nothing "
 781                                  "to do!!!\n", nesqp->hwqp.qp_id, cm_id,
 782                                  atomic_read(&nesqp->refcount));
 783                }
 784        } else if (rem_node) {
 785                /* TIME_WAIT state */
 786                rem_ref_cm_node(cm_node->cm_core, cm_node);
 787        }
 788        if (cm_node->cm_id)
 789                cm_id->rem_ref(cm_id);
 790        kfree(recv_entry);
 791        cm_node->recv_entry = NULL;
 792}
 793
 794/**
 795 * nes_cm_timer_tick
 796 */
 797static void nes_cm_timer_tick(unsigned long pass)
 798{
 799        unsigned long flags;
 800        unsigned long nexttimeout = jiffies + NES_LONG_TIME;
 801        struct nes_cm_node *cm_node;
 802        struct nes_timer_entry *send_entry, *recv_entry;
 803        struct list_head *list_core_temp;
 804        struct list_head *list_node;
 805        struct nes_cm_core *cm_core = g_cm_core;
 806        u32 settimer = 0;
 807        unsigned long timetosend;
 808        int ret = NETDEV_TX_OK;
 809
 810        struct list_head timer_list;
 811
 812        INIT_LIST_HEAD(&timer_list);
 813        spin_lock_irqsave(&cm_core->ht_lock, flags);
 814
 815        list_for_each_safe(list_node, list_core_temp,
 816                           &cm_core->connected_nodes) {
 817                cm_node = container_of(list_node, struct nes_cm_node, list);
 818                if ((cm_node->recv_entry) || (cm_node->send_entry)) {
 819                        add_ref_cm_node(cm_node);
 820                        list_add(&cm_node->timer_entry, &timer_list);
 821                }
 822        }
 823        spin_unlock_irqrestore(&cm_core->ht_lock, flags);
 824
 825        list_for_each_safe(list_node, list_core_temp, &timer_list) {
 826                cm_node = container_of(list_node, struct nes_cm_node,
 827                                       timer_entry);
 828                recv_entry = cm_node->recv_entry;
 829
 830                if (recv_entry) {
 831                        if (time_after(recv_entry->timetosend, jiffies)) {
 832                                if (nexttimeout > recv_entry->timetosend ||
 833                                    !settimer) {
 834                                        nexttimeout = recv_entry->timetosend;
 835                                        settimer = 1;
 836                                }
 837                        } else {
 838                                handle_recv_entry(cm_node, 1);
 839                        }
 840                }
 841
 842                spin_lock_irqsave(&cm_node->retrans_list_lock, flags);
 843                do {
 844                        send_entry = cm_node->send_entry;
 845                        if (!send_entry)
 846                                break;
 847                        if (time_after(send_entry->timetosend, jiffies)) {
 848                                if (cm_node->state != NES_CM_STATE_TSA) {
 849                                        if ((nexttimeout >
 850                                             send_entry->timetosend) ||
 851                                            !settimer) {
 852                                                nexttimeout =
 853                                                        send_entry->timetosend;
 854                                                settimer = 1;
 855                                        }
 856                                } else {
 857                                        free_retrans_entry(cm_node);
 858                                }
 859                                break;
 860                        }
 861
 862                        if ((cm_node->state == NES_CM_STATE_TSA) ||
 863                            (cm_node->state == NES_CM_STATE_CLOSED)) {
 864                                free_retrans_entry(cm_node);
 865                                break;
 866                        }
 867
 868                        if (!send_entry->retranscount ||
 869                            !send_entry->retrycount) {
 870                                cm_packets_dropped++;
 871                                free_retrans_entry(cm_node);
 872
 873                                spin_unlock_irqrestore(
 874                                        &cm_node->retrans_list_lock, flags);
 875                                nes_retrans_expired(cm_node);
 876                                cm_node->state = NES_CM_STATE_CLOSED;
 877                                spin_lock_irqsave(&cm_node->retrans_list_lock,
 878                                                  flags);
 879                                break;
 880                        }
 881                        atomic_inc(&send_entry->skb->users);
 882                        cm_packets_retrans++;
 883                        nes_debug(NES_DBG_CM, "Retransmitting send_entry %p "
 884                                  "for node %p, jiffies = %lu, time to send = "
 885                                  "%lu, retranscount = %u, send_entry->seq_num = "
 886                                  "0x%08X, cm_node->tcp_cntxt.rem_ack_num = "
 887                                  "0x%08X\n", send_entry, cm_node, jiffies,
 888                                  send_entry->timetosend,
 889                                  send_entry->retranscount,
 890                                  send_entry->seq_num,
 891                                  cm_node->tcp_cntxt.rem_ack_num);
 892
 893                        spin_unlock_irqrestore(&cm_node->retrans_list_lock,
 894                                               flags);
 895                        ret = nes_nic_cm_xmit(send_entry->skb, cm_node->netdev);
 896                        spin_lock_irqsave(&cm_node->retrans_list_lock, flags);
 897                        if (ret != NETDEV_TX_OK) {
 898                                nes_debug(NES_DBG_CM, "rexmit failed for "
 899                                          "node=%p\n", cm_node);
 900                                cm_packets_bounced++;
 901                                send_entry->retrycount--;
 902                                nexttimeout = jiffies + NES_SHORT_TIME;
 903                                settimer = 1;
 904                                break;
 905                        } else {
 906                                cm_packets_sent++;
 907                        }
 908                        nes_debug(NES_DBG_CM, "Packet Sent: retrans count = "
 909                                  "%u, retry count = %u.\n",
 910                                  send_entry->retranscount,
 911                                  send_entry->retrycount);
 912                        if (send_entry->send_retrans) {
 913                                send_entry->retranscount--;
 914                                timetosend = (NES_RETRY_TIMEOUT <<
 915                                              (NES_DEFAULT_RETRANS - send_entry->retranscount));
 916
 917                                send_entry->timetosend = jiffies +
 918                                                         min(timetosend, NES_MAX_TIMEOUT);
 919                                if (nexttimeout > send_entry->timetosend ||
 920                                    !settimer) {
 921                                        nexttimeout = send_entry->timetosend;
 922                                        settimer = 1;
 923                                }
 924                        } else {
 925                                int close_when_complete;
 926                                close_when_complete =
 927                                        send_entry->close_when_complete;
 928                                nes_debug(NES_DBG_CM, "cm_node=%p state=%d\n",
 929                                          cm_node, cm_node->state);
 930                                free_retrans_entry(cm_node);
 931                                if (close_when_complete)
 932                                        rem_ref_cm_node(cm_node->cm_core,
 933                                                        cm_node);
 934                        }
 935                } while (0);
 936
 937                spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);
 938                rem_ref_cm_node(cm_node->cm_core, cm_node);
 939        }
 940
 941        if (settimer) {
 942                if (!timer_pending(&cm_core->tcp_timer))
 943                        mod_timer(&cm_core->tcp_timer, nexttimeout);
 944        }
 945}
 946
 947
 948/**
 949 * send_syn
 950 */
 951static int send_syn(struct nes_cm_node *cm_node, u32 sendack,
 952                    struct sk_buff *skb)
 953{
 954        int ret;
 955        int flags = SET_SYN;
 956        char optionsbuffer[sizeof(struct option_mss) +
 957                           sizeof(struct option_windowscale) + sizeof(struct option_base) +
 958                           TCP_OPTIONS_PADDING];
 959
 960        int optionssize = 0;
 961        /* Sending MSS option */
 962        union all_known_options *options;
 963
 964        if (!cm_node)
 965                return -EINVAL;
 966
 967        options = (union all_known_options *)&optionsbuffer[optionssize];
 968        options->as_mss.optionnum = OPTION_NUMBER_MSS;
 969        options->as_mss.length = sizeof(struct option_mss);
 970        options->as_mss.mss = htons(cm_node->tcp_cntxt.mss);
 971        optionssize += sizeof(struct option_mss);
 972
 973        options = (union all_known_options *)&optionsbuffer[optionssize];
 974        options->as_windowscale.optionnum = OPTION_NUMBER_WINDOW_SCALE;
 975        options->as_windowscale.length = sizeof(struct option_windowscale);
 976        options->as_windowscale.shiftcount = cm_node->tcp_cntxt.rcv_wscale;
 977        optionssize += sizeof(struct option_windowscale);
 978
 979        if (sendack && !(NES_DRV_OPT_SUPRESS_OPTION_BC & nes_drv_opt)) {
 980                options = (union all_known_options *)&optionsbuffer[optionssize];
 981                options->as_base.optionnum = OPTION_NUMBER_WRITE0;
 982                options->as_base.length = sizeof(struct option_base);
 983                optionssize += sizeof(struct option_base);
 984                /* we need the size to be a multiple of 4 */
 985                options = (union all_known_options *)&optionsbuffer[optionssize];
 986                options->as_end = 1;
 987                optionssize += 1;
 988                options = (union all_known_options *)&optionsbuffer[optionssize];
 989                options->as_end = 1;
 990                optionssize += 1;
 991        }
 992
 993        options = (union all_known_options *)&optionsbuffer[optionssize];
 994        options->as_end = OPTION_NUMBER_END;
 995        optionssize += 1;
 996
 997        if (!skb)
 998                skb = dev_alloc_skb(MAX_CM_BUFFER);
 999        if (!skb) {
1000                nes_debug(NES_DBG_CM, "Failed to get a Free pkt\n");
1001                return -1;
1002        }
1003
1004        if (sendack)
1005                flags |= SET_ACK;
1006
1007        form_cm_frame(skb, cm_node, optionsbuffer, optionssize, NULL, 0, flags);
1008        ret = schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 1, 0);
1009
1010        return ret;
1011}
1012
1013
1014/**
1015 * send_reset
1016 */
1017static int send_reset(struct nes_cm_node *cm_node, struct sk_buff *skb)
1018{
1019        int ret;
1020        int flags = SET_RST | SET_ACK;
1021
1022        if (!skb)
1023                skb = dev_alloc_skb(MAX_CM_BUFFER);
1024        if (!skb) {
1025                nes_debug(NES_DBG_CM, "Failed to get a Free pkt\n");
1026                return -ENOMEM;
1027        }
1028
1029        form_cm_frame(skb, cm_node, NULL, 0, NULL, 0, flags);
1030        ret = schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 0, 1);
1031
1032        return ret;
1033}
1034
1035
1036/**
1037 * send_ack
1038 */
1039static int send_ack(struct nes_cm_node *cm_node, struct sk_buff *skb)
1040{
1041        int ret;
1042
1043        if (!skb)
1044                skb = dev_alloc_skb(MAX_CM_BUFFER);
1045
1046        if (!skb) {
1047                nes_debug(NES_DBG_CM, "Failed to get a Free pkt\n");
1048                return -1;
1049        }
1050
1051        form_cm_frame(skb, cm_node, NULL, 0, NULL, 0, SET_ACK);
1052        ret = schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 0, 0);
1053
1054        return ret;
1055}
1056
1057
1058/**
1059 * send_fin
1060 */
1061static int send_fin(struct nes_cm_node *cm_node, struct sk_buff *skb)
1062{
1063        int ret;
1064
1065        /* if we didn't get a frame get one */
1066        if (!skb)
1067                skb = dev_alloc_skb(MAX_CM_BUFFER);
1068
1069        if (!skb) {
1070                nes_debug(NES_DBG_CM, "Failed to get a Free pkt\n");
1071                return -1;
1072        }
1073
1074        form_cm_frame(skb, cm_node, NULL, 0, NULL, 0, SET_ACK | SET_FIN);
1075        ret = schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 1, 0);
1076
1077        return ret;
1078}
1079
1080
1081/**
1082 * find_node - find a cm node that matches the reference cm node
1083 */
1084static struct nes_cm_node *find_node(struct nes_cm_core *cm_core,
1085                                     u16 rem_port, nes_addr_t rem_addr, u16 loc_port, nes_addr_t loc_addr)
1086{
1087        unsigned long flags;
1088        struct list_head *hte;
1089        struct nes_cm_node *cm_node;
1090
1091        /* get a handle on the hte */
1092        hte = &cm_core->connected_nodes;
1093
1094        /* walk list and find cm_node associated with this session ID */
1095        spin_lock_irqsave(&cm_core->ht_lock, flags);
1096        list_for_each_entry(cm_node, hte, list) {
1097                /* compare quad, return node handle if a match */
1098                nes_debug(NES_DBG_CM, "finding node %x:%x =? %x:%x ^ %x:%x =? %x:%x\n",
1099                          cm_node->loc_addr, cm_node->loc_port,
1100                          loc_addr, loc_port,
1101                          cm_node->rem_addr, cm_node->rem_port,
1102                          rem_addr, rem_port);
1103                if ((cm_node->loc_addr == loc_addr) && (cm_node->loc_port == loc_port) &&
1104                    (cm_node->rem_addr == rem_addr) && (cm_node->rem_port == rem_port)) {
1105                        add_ref_cm_node(cm_node);
1106                        spin_unlock_irqrestore(&cm_core->ht_lock, flags);
1107                        return cm_node;
1108                }
1109        }
1110        spin_unlock_irqrestore(&cm_core->ht_lock, flags);
1111
1112        /* no owner node */
1113        return NULL;
1114}
1115
1116
1117/**
1118 * find_listener - find a cm node listening on this addr-port pair
1119 */
1120static struct nes_cm_listener *find_listener(struct nes_cm_core *cm_core,
1121                                             nes_addr_t dst_addr, u16 dst_port, enum nes_cm_listener_state listener_state)
1122{
1123        unsigned long flags;
1124        struct nes_cm_listener *listen_node;
1125
1126        /* walk list and find cm_node associated with this session ID */
1127        spin_lock_irqsave(&cm_core->listen_list_lock, flags);
1128        list_for_each_entry(listen_node, &cm_core->listen_list.list, list) {
1129                /* compare node pair, return node handle if a match */
1130                if (((listen_node->loc_addr == dst_addr) ||
1131                     listen_node->loc_addr == 0x00000000) &&
1132                    (listen_node->loc_port == dst_port) &&
1133                    (listener_state & listen_node->listener_state)) {
1134                        atomic_inc(&listen_node->ref_count);
1135                        spin_unlock_irqrestore(&cm_core->listen_list_lock, flags);
1136                        return listen_node;
1137                }
1138        }
1139        spin_unlock_irqrestore(&cm_core->listen_list_lock, flags);
1140
1141        /* no listener */
1142        return NULL;
1143}
1144
1145
1146/**
1147 * add_hte_node - add a cm node to the hash table
1148 */
1149static int add_hte_node(struct nes_cm_core *cm_core, struct nes_cm_node *cm_node)
1150{
1151        unsigned long flags;
1152        struct list_head *hte;
1153
1154        if (!cm_node || !cm_core)
1155                return -EINVAL;
1156
1157        nes_debug(NES_DBG_CM, "Adding Node %p to Active Connection HT\n",
1158                  cm_node);
1159
1160        spin_lock_irqsave(&cm_core->ht_lock, flags);
1161
1162        /* get a handle on the hash table element (list head for this slot) */
1163        hte = &cm_core->connected_nodes;
1164        list_add_tail(&cm_node->list, hte);
1165        atomic_inc(&cm_core->ht_node_cnt);
1166
1167        spin_unlock_irqrestore(&cm_core->ht_lock, flags);
1168
1169        return 0;
1170}
1171
1172
1173/**
1174 * mini_cm_dec_refcnt_listen
1175 */
1176static int mini_cm_dec_refcnt_listen(struct nes_cm_core *cm_core,
1177                                     struct nes_cm_listener *listener, int free_hanging_nodes)
1178{
1179        int ret = -EINVAL;
1180        int err = 0;
1181        unsigned long flags;
1182        struct list_head *list_pos = NULL;
1183        struct list_head *list_temp = NULL;
1184        struct nes_cm_node *cm_node = NULL;
1185        struct list_head reset_list;
1186
1187        nes_debug(NES_DBG_CM, "attempting listener= %p free_nodes= %d, "
1188                  "refcnt=%d\n", listener, free_hanging_nodes,
1189                  atomic_read(&listener->ref_count));
1190        /* free non-accelerated child nodes for this listener */
1191        INIT_LIST_HEAD(&reset_list);
1192        if (free_hanging_nodes) {
1193                spin_lock_irqsave(&cm_core->ht_lock, flags);
1194                list_for_each_safe(list_pos, list_temp,
1195                                   &g_cm_core->connected_nodes) {
1196                        cm_node = container_of(list_pos, struct nes_cm_node,
1197                                               list);
1198                        if ((cm_node->listener == listener) &&
1199                            (!cm_node->accelerated)) {
1200                                add_ref_cm_node(cm_node);
1201                                list_add(&cm_node->reset_entry, &reset_list);
1202                        }
1203                }
1204                spin_unlock_irqrestore(&cm_core->ht_lock, flags);
1205        }
1206
1207        list_for_each_safe(list_pos, list_temp, &reset_list) {
1208                cm_node = container_of(list_pos, struct nes_cm_node,
1209                                       reset_entry);
1210                {
1211                        struct nes_cm_node *loopback = cm_node->loopbackpartner;
1212                        enum nes_cm_node_state old_state;
1213                        if (NES_CM_STATE_FIN_WAIT1 <= cm_node->state) {
1214                                rem_ref_cm_node(cm_node->cm_core, cm_node);
1215                        } else {
1216                                if (!loopback) {
1217                                        cleanup_retrans_entry(cm_node);
1218                                        err = send_reset(cm_node, NULL);
1219                                        if (err) {
1220                                                cm_node->state =
1221                                                        NES_CM_STATE_CLOSED;
1222                                                WARN_ON(1);
1223                                        } else {
1224                                                old_state = cm_node->state;
1225                                                cm_node->state = NES_CM_STATE_LISTENER_DESTROYED;
1226                                                if (old_state != NES_CM_STATE_MPAREQ_RCVD)
1227                                                        rem_ref_cm_node(
1228                                                                cm_node->cm_core,
1229                                                                cm_node);
1230                                        }
1231                                } else {
1232                                        struct nes_cm_event event;
1233
1234                                        event.cm_node = loopback;
1235                                        event.cm_info.rem_addr =
1236                                                        loopback->rem_addr;
1237                                        event.cm_info.loc_addr =
1238                                                        loopback->loc_addr;
1239                                        event.cm_info.rem_port =
1240                                                        loopback->rem_port;
1241                                        event.cm_info.loc_port =
1242                                                         loopback->loc_port;
1243                                        event.cm_info.cm_id = loopback->cm_id;
1244                                        add_ref_cm_node(loopback);
1245                                        loopback->state = NES_CM_STATE_CLOSED;
1246                                        cm_event_connect_error(&event);
1247                                        cm_node->state = NES_CM_STATE_LISTENER_DESTROYED;
1248
1249                                        rem_ref_cm_node(cm_node->cm_core,
1250                                                         cm_node);
1251
1252                                }
1253                        }
1254                }
1255        }
1256
1257        spin_lock_irqsave(&cm_core->listen_list_lock, flags);
1258        if (!atomic_dec_return(&listener->ref_count)) {
1259                list_del(&listener->list);
1260
1261                /* decrement our listen node count */
1262                atomic_dec(&cm_core->listen_node_cnt);
1263
1264                spin_unlock_irqrestore(&cm_core->listen_list_lock, flags);
1265
1266                if (listener->nesvnic)
1267                        nes_manage_apbvt(listener->nesvnic, listener->loc_port,
1268                                         PCI_FUNC(listener->nesvnic->nesdev->pcidev->devfn), NES_MANAGE_APBVT_DEL);
1269
1270                nes_debug(NES_DBG_CM, "destroying listener (%p)\n", listener);
1271
1272                kfree(listener);
1273                listener = NULL;
1274                ret = 0;
1275                atomic_inc(&cm_listens_destroyed);
1276        } else {
1277                spin_unlock_irqrestore(&cm_core->listen_list_lock, flags);
1278        }
1279        if (listener) {
1280                if (atomic_read(&listener->pend_accepts_cnt) > 0)
1281                        nes_debug(NES_DBG_CM, "destroying listener (%p)"
1282                                  " with non-zero pending accepts=%u\n",
1283                                  listener, atomic_read(&listener->pend_accepts_cnt));
1284        }
1285
1286        return ret;
1287}
1288
1289
1290/**
1291 * mini_cm_del_listen
1292 */
1293static int mini_cm_del_listen(struct nes_cm_core *cm_core,
1294                              struct nes_cm_listener *listener)
1295{
1296        listener->listener_state = NES_CM_LISTENER_PASSIVE_STATE;
1297        listener->cm_id = NULL; /* going to be destroyed pretty soon */
1298        return mini_cm_dec_refcnt_listen(cm_core, listener, 1);
1299}
1300
1301
1302/**
1303 * mini_cm_accelerated
1304 */
1305static inline int mini_cm_accelerated(struct nes_cm_core *cm_core,
1306                                      struct nes_cm_node *cm_node)
1307{
1308        cm_node->accelerated = 1;
1309
1310        if (cm_node->accept_pend) {
1311                BUG_ON(!cm_node->listener);
1312                atomic_dec(&cm_node->listener->pend_accepts_cnt);
1313                cm_node->accept_pend = 0;
1314                BUG_ON(atomic_read(&cm_node->listener->pend_accepts_cnt) < 0);
1315        }
1316
1317        if (!timer_pending(&cm_core->tcp_timer))
1318                mod_timer(&cm_core->tcp_timer, (jiffies + NES_SHORT_TIME));
1319
1320        return 0;
1321}
1322
1323
1324/**
1325 * nes_addr_resolve_neigh
1326 */
1327static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpindex)
1328{
1329        struct rtable *rt;
1330        struct neighbour *neigh;
1331        int rc = arpindex;
1332        struct net_device *netdev;
1333        struct nes_adapter *nesadapter = nesvnic->nesdev->nesadapter;
1334
1335        rt = ip_route_output(&init_net, htonl(dst_ip), 0, 0, 0);
1336        if (IS_ERR(rt)) {
1337                printk(KERN_ERR "%s: ip_route_output_key failed for 0x%08X\n",
1338                       __func__, dst_ip);
1339                return rc;
1340        }
1341
1342        if (netif_is_bond_slave(nesvnic->netdev))
1343                netdev = netdev_master_upper_dev_get(nesvnic->netdev);
1344        else
1345                netdev = nesvnic->netdev;
1346
1347        neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, netdev);
1348
1349        rcu_read_lock();
1350        if (neigh) {
1351                if (neigh->nud_state & NUD_VALID) {
1352                        nes_debug(NES_DBG_CM, "Neighbor MAC address for 0x%08X"
1353                                  " is %pM, Gateway is 0x%08X \n", dst_ip,
1354                                  neigh->ha, ntohl(rt->rt_gateway));
1355
1356                        if (arpindex >= 0) {
1357                                if (!memcmp(nesadapter->arp_table[arpindex].mac_addr,
1358                                            neigh->ha, ETH_ALEN)) {
1359                                        /* Mac address same as in nes_arp_table */
1360                                        goto out;
1361                                }
1362
1363                                nes_manage_arp_cache(nesvnic->netdev,
1364                                                     nesadapter->arp_table[arpindex].mac_addr,
1365                                                     dst_ip, NES_ARP_DELETE);
1366                        }
1367
1368                        nes_manage_arp_cache(nesvnic->netdev, neigh->ha,
1369                                             dst_ip, NES_ARP_ADD);
1370                        rc = nes_arp_table(nesvnic->nesdev, dst_ip, NULL,
1371                                           NES_ARP_RESOLVE);
1372                } else {
1373                        neigh_event_send(neigh, NULL);
1374                }
1375        }
1376out:
1377        rcu_read_unlock();
1378
1379        if (neigh)
1380                neigh_release(neigh);
1381
1382        ip_rt_put(rt);
1383        return rc;
1384}
1385
1386/**
1387 * make_cm_node - create a new instance of a cm node
1388 */
1389static struct nes_cm_node *make_cm_node(struct nes_cm_core *cm_core,
1390                                        struct nes_vnic *nesvnic, struct nes_cm_info *cm_info,
1391                                        struct nes_cm_listener *listener)
1392{
1393        struct nes_cm_node *cm_node;
1394        struct timespec ts;
1395        int oldarpindex = 0;
1396        int arpindex = 0;
1397        struct nes_device *nesdev;
1398        struct nes_adapter *nesadapter;
1399
1400        /* create an hte and cm_node for this instance */
1401        cm_node = kzalloc(sizeof(*cm_node), GFP_ATOMIC);
1402        if (!cm_node)
1403                return NULL;
1404
1405        /* set our node specific transport info */
1406        cm_node->loc_addr = cm_info->loc_addr;
1407        cm_node->rem_addr = cm_info->rem_addr;
1408        cm_node->loc_port = cm_info->loc_port;
1409        cm_node->rem_port = cm_info->rem_port;
1410
1411        cm_node->mpa_frame_rev = mpa_version;
1412        cm_node->send_rdma0_op = SEND_RDMA_READ_ZERO;
1413        cm_node->ird_size = IETF_NO_IRD_ORD;
1414        cm_node->ord_size = IETF_NO_IRD_ORD;
1415
1416        nes_debug(NES_DBG_CM, "Make node addresses : loc = %pI4:%x, rem = %pI4:%x\n",
1417                  &cm_node->loc_addr, cm_node->loc_port,
1418                  &cm_node->rem_addr, cm_node->rem_port);
1419        cm_node->listener = listener;
1420        cm_node->netdev = nesvnic->netdev;
1421        cm_node->cm_id = cm_info->cm_id;
1422        memcpy(cm_node->loc_mac, nesvnic->netdev->dev_addr, ETH_ALEN);
1423
1424        nes_debug(NES_DBG_CM, "listener=%p, cm_id=%p\n", cm_node->listener,
1425                  cm_node->cm_id);
1426
1427        spin_lock_init(&cm_node->retrans_list_lock);
1428
1429        cm_node->loopbackpartner = NULL;
1430        atomic_set(&cm_node->ref_count, 1);
1431        /* associate our parent CM core */
1432        cm_node->cm_core = cm_core;
1433        cm_node->tcp_cntxt.loc_id = NES_CM_DEF_LOCAL_ID;
1434        cm_node->tcp_cntxt.rcv_wscale = NES_CM_DEFAULT_RCV_WND_SCALE;
1435        cm_node->tcp_cntxt.rcv_wnd = NES_CM_DEFAULT_RCV_WND_SCALED >>
1436                                     NES_CM_DEFAULT_RCV_WND_SCALE;
1437        ts = current_kernel_time();
1438        cm_node->tcp_cntxt.loc_seq_num = htonl(ts.tv_nsec);
1439        cm_node->tcp_cntxt.mss = nesvnic->max_frame_size - sizeof(struct iphdr) -
1440                                 sizeof(struct tcphdr) - ETH_HLEN - VLAN_HLEN;
1441        cm_node->tcp_cntxt.rcv_nxt = 0;
1442        /* get a unique session ID , add thread_id to an upcounter to handle race */
1443        atomic_inc(&cm_core->node_cnt);
1444        cm_node->conn_type = cm_info->conn_type;
1445        cm_node->apbvt_set = 0;
1446        cm_node->accept_pend = 0;
1447
1448        cm_node->nesvnic = nesvnic;
1449        /* get some device handles, for arp lookup */
1450        nesdev = nesvnic->nesdev;
1451        nesadapter = nesdev->nesadapter;
1452
1453        cm_node->loopbackpartner = NULL;
1454
1455        /* get the mac addr for the remote node */
1456        oldarpindex = nes_arp_table(nesdev, cm_node->rem_addr, NULL, NES_ARP_RESOLVE);
1457        arpindex = nes_addr_resolve_neigh(nesvnic, cm_info->rem_addr, oldarpindex);
1458        if (arpindex < 0) {
1459                kfree(cm_node);
1460                return NULL;
1461        }
1462
1463        /* copy the mac addr to node context */
1464        memcpy(cm_node->rem_mac, nesadapter->arp_table[arpindex].mac_addr, ETH_ALEN);
1465        nes_debug(NES_DBG_CM, "Remote mac addr from arp table: %pM\n",
1466                  cm_node->rem_mac);
1467
1468        add_hte_node(cm_core, cm_node);
1469        atomic_inc(&cm_nodes_created);
1470
1471        return cm_node;
1472}
1473
1474
1475/**
1476 * add_ref_cm_node - destroy an instance of a cm node
1477 */
1478static int add_ref_cm_node(struct nes_cm_node *cm_node)
1479{
1480        atomic_inc(&cm_node->ref_count);
1481        return 0;
1482}
1483
1484
1485/**
1486 * rem_ref_cm_node - destroy an instance of a cm node
1487 */
1488static int rem_ref_cm_node(struct nes_cm_core *cm_core,
1489                           struct nes_cm_node *cm_node)
1490{
1491        unsigned long flags;
1492        struct nes_qp *nesqp;
1493
1494        if (!cm_node)
1495                return -EINVAL;
1496
1497        spin_lock_irqsave(&cm_node->cm_core->ht_lock, flags);
1498        if (atomic_dec_return(&cm_node->ref_count)) {
1499                spin_unlock_irqrestore(&cm_node->cm_core->ht_lock, flags);
1500                return 0;
1501        }
1502        list_del(&cm_node->list);
1503        atomic_dec(&cm_core->ht_node_cnt);
1504        spin_unlock_irqrestore(&cm_node->cm_core->ht_lock, flags);
1505
1506        /* if the node is destroyed before connection was accelerated */
1507        if (!cm_node->accelerated && cm_node->accept_pend) {
1508                BUG_ON(!cm_node->listener);
1509                atomic_dec(&cm_node->listener->pend_accepts_cnt);
1510                BUG_ON(atomic_read(&cm_node->listener->pend_accepts_cnt) < 0);
1511        }
1512        WARN_ON(cm_node->send_entry);
1513        if (cm_node->recv_entry)
1514                handle_recv_entry(cm_node, 0);
1515        if (cm_node->listener) {
1516                mini_cm_dec_refcnt_listen(cm_core, cm_node->listener, 0);
1517        } else {
1518                if (cm_node->apbvt_set && cm_node->nesvnic) {
1519                        nes_manage_apbvt(cm_node->nesvnic, cm_node->loc_port,
1520                                         PCI_FUNC(
1521                                                 cm_node->nesvnic->nesdev->pcidev->devfn),
1522                                         NES_MANAGE_APBVT_DEL);
1523                }
1524        }
1525
1526        atomic_dec(&cm_core->node_cnt);
1527        atomic_inc(&cm_nodes_destroyed);
1528        nesqp = cm_node->nesqp;
1529        if (nesqp) {
1530                nesqp->cm_node = NULL;
1531                nes_rem_ref(&nesqp->ibqp);
1532                cm_node->nesqp = NULL;
1533        }
1534
1535        kfree(cm_node);
1536        return 0;
1537}
1538
1539/**
1540 * process_options
1541 */
1542static int process_options(struct nes_cm_node *cm_node, u8 *optionsloc,
1543                           u32 optionsize, u32 syn_packet)
1544{
1545        u32 tmp;
1546        u32 offset = 0;
1547        union all_known_options *all_options;
1548        char got_mss_option = 0;
1549
1550        while (offset < optionsize) {
1551                all_options = (union all_known_options *)(optionsloc + offset);
1552                switch (all_options->as_base.optionnum) {
1553                case OPTION_NUMBER_END:
1554                        offset = optionsize;
1555                        break;
1556                case OPTION_NUMBER_NONE:
1557                        offset += 1;
1558                        continue;
1559                case OPTION_NUMBER_MSS:
1560                        nes_debug(NES_DBG_CM, "%s: MSS Length: %d Offset: %d "
1561                                  "Size: %d\n", __func__,
1562                                  all_options->as_mss.length, offset, optionsize);
1563                        got_mss_option = 1;
1564                        if (all_options->as_mss.length != 4) {
1565                                return 1;
1566                        } else {
1567                                tmp = ntohs(all_options->as_mss.mss);
1568                                if (tmp > 0 && tmp <
1569                                    cm_node->tcp_cntxt.mss)
1570                                        cm_node->tcp_cntxt.mss = tmp;
1571                        }
1572                        break;
1573                case OPTION_NUMBER_WINDOW_SCALE:
1574                        cm_node->tcp_cntxt.snd_wscale =
1575                                all_options->as_windowscale.shiftcount;
1576                        break;
1577                default:
1578                        nes_debug(NES_DBG_CM, "TCP Option not understood: %x\n",
1579                                  all_options->as_base.optionnum);
1580                        break;
1581                }
1582                offset += all_options->as_base.length;
1583        }
1584        if ((!got_mss_option) && (syn_packet))
1585                cm_node->tcp_cntxt.mss = NES_CM_DEFAULT_MSS;
1586        return 0;
1587}
1588
1589static void drop_packet(struct sk_buff *skb)
1590{
1591        atomic_inc(&cm_accel_dropped_pkts);
1592        dev_kfree_skb_any(skb);
1593}
1594
1595static void handle_fin_pkt(struct nes_cm_node *cm_node)
1596{
1597        nes_debug(NES_DBG_CM, "Received FIN, cm_node = %p, state = %u. "
1598                  "refcnt=%d\n", cm_node, cm_node->state,
1599                  atomic_read(&cm_node->ref_count));
1600        switch (cm_node->state) {
1601        case NES_CM_STATE_SYN_RCVD:
1602        case NES_CM_STATE_SYN_SENT:
1603        case NES_CM_STATE_ESTABLISHED:
1604        case NES_CM_STATE_MPAREJ_RCVD:
1605                cm_node->tcp_cntxt.rcv_nxt++;
1606                cleanup_retrans_entry(cm_node);
1607                cm_node->state = NES_CM_STATE_LAST_ACK;
1608                send_fin(cm_node, NULL);
1609                break;
1610        case NES_CM_STATE_MPAREQ_SENT:
1611                create_event(cm_node, NES_CM_EVENT_ABORTED);
1612                cm_node->tcp_cntxt.rcv_nxt++;
1613                cleanup_retrans_entry(cm_node);
1614                cm_node->state = NES_CM_STATE_CLOSED;
1615                add_ref_cm_node(cm_node);
1616                send_reset(cm_node, NULL);
1617                break;
1618        case NES_CM_STATE_FIN_WAIT1:
1619                cm_node->tcp_cntxt.rcv_nxt++;
1620                cleanup_retrans_entry(cm_node);
1621                cm_node->state = NES_CM_STATE_CLOSING;
1622                send_ack(cm_node, NULL);
1623                /* Wait for ACK as this is simultaneous close..
1624                * After we receive ACK, do not send anything..
1625                * Just rm the node.. Done.. */
1626                break;
1627        case NES_CM_STATE_FIN_WAIT2:
1628                cm_node->tcp_cntxt.rcv_nxt++;
1629                cleanup_retrans_entry(cm_node);
1630                cm_node->state = NES_CM_STATE_TIME_WAIT;
1631                send_ack(cm_node, NULL);
1632                schedule_nes_timer(cm_node, NULL,  NES_TIMER_TYPE_CLOSE, 1, 0);
1633                break;
1634        case NES_CM_STATE_TIME_WAIT:
1635                cm_node->tcp_cntxt.rcv_nxt++;
1636                cleanup_retrans_entry(cm_node);
1637                cm_node->state = NES_CM_STATE_CLOSED;
1638                rem_ref_cm_node(cm_node->cm_core, cm_node);
1639                break;
1640        case NES_CM_STATE_TSA:
1641        default:
1642                nes_debug(NES_DBG_CM, "Error Rcvd FIN for node-%p state = %d\n",
1643                        cm_node, cm_node->state);
1644                break;
1645        }
1646}
1647
1648
1649static void handle_rst_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb,
1650        struct tcphdr *tcph)
1651{
1652
1653        int     reset = 0;      /* whether to send reset in case of err.. */
1654        atomic_inc(&cm_resets_recvd);
1655        nes_debug(NES_DBG_CM, "Received Reset, cm_node = %p, state = %u."
1656                        " refcnt=%d\n", cm_node, cm_node->state,
1657                        atomic_read(&cm_node->ref_count));
1658        cleanup_retrans_entry(cm_node);
1659        switch (cm_node->state) {
1660        case NES_CM_STATE_SYN_SENT:
1661        case NES_CM_STATE_MPAREQ_SENT:
1662                nes_debug(NES_DBG_CM, "%s[%u] create abort for cm_node=%p "
1663                        "listener=%p state=%d\n", __func__, __LINE__, cm_node,
1664                        cm_node->listener, cm_node->state);
1665                switch (cm_node->mpa_frame_rev) {
1666                case IETF_MPA_V2:
1667                        cm_node->mpa_frame_rev = IETF_MPA_V1;
1668                        /* send a syn and goto syn sent state */
1669                        cm_node->state = NES_CM_STATE_SYN_SENT;
1670                        if (send_syn(cm_node, 0, NULL)) {
1671                                active_open_err(cm_node, skb, reset);
1672                        }
1673                        break;
1674                case IETF_MPA_V1:
1675                default:
1676                        active_open_err(cm_node, skb, reset);
1677                        break;
1678                }
1679                break;
1680        case NES_CM_STATE_MPAREQ_RCVD:
1681                atomic_inc(&cm_node->passive_state);
1682                dev_kfree_skb_any(skb);
1683                break;
1684        case NES_CM_STATE_ESTABLISHED:
1685        case NES_CM_STATE_SYN_RCVD:
1686        case NES_CM_STATE_LISTENING:
1687                nes_debug(NES_DBG_CM, "Bad state %s[%u]\n", __func__, __LINE__);
1688                passive_open_err(cm_node, skb, reset);
1689                break;
1690        case NES_CM_STATE_TSA:
1691                active_open_err(cm_node, skb, reset);
1692                break;
1693        case NES_CM_STATE_CLOSED:
1694                drop_packet(skb);
1695                break;
1696        case NES_CM_STATE_FIN_WAIT2:
1697        case NES_CM_STATE_FIN_WAIT1:
1698        case NES_CM_STATE_LAST_ACK:
1699                cm_node->cm_id->rem_ref(cm_node->cm_id);
1700        case NES_CM_STATE_TIME_WAIT:
1701                cm_node->state = NES_CM_STATE_CLOSED;
1702                rem_ref_cm_node(cm_node->cm_core, cm_node);
1703                drop_packet(skb);
1704                break;
1705        default:
1706                drop_packet(skb);
1707                break;
1708        }
1709}
1710
1711
1712static void handle_rcv_mpa(struct nes_cm_node *cm_node, struct sk_buff *skb)
1713{
1714        int ret = 0;
1715        int datasize = skb->len;
1716        u8 *dataloc = skb->data;
1717
1718        enum nes_cm_event_type type = NES_CM_EVENT_UNKNOWN;
1719        u32 res_type;
1720
1721        ret = parse_mpa(cm_node, dataloc, &res_type, datasize);
1722        if (ret) {
1723                nes_debug(NES_DBG_CM, "didn't like MPA Request\n");
1724                if (cm_node->state == NES_CM_STATE_MPAREQ_SENT) {
1725                        nes_debug(NES_DBG_CM, "%s[%u] create abort for "
1726                                  "cm_node=%p listener=%p state=%d\n", __func__,
1727                                  __LINE__, cm_node, cm_node->listener,
1728                                  cm_node->state);
1729                        active_open_err(cm_node, skb, 1);
1730                } else {
1731                        passive_open_err(cm_node, skb, 1);
1732                }
1733                return;
1734        }
1735
1736        switch (cm_node->state) {
1737        case NES_CM_STATE_ESTABLISHED:
1738                if (res_type == NES_MPA_REQUEST_REJECT)
1739                        /*BIG problem as we are receiving the MPA.. So should
1740                         * not be REJECT.. This is Passive Open.. We can
1741                         * only receive it Reject for Active Open...*/
1742                        WARN_ON(1);
1743                cm_node->state = NES_CM_STATE_MPAREQ_RCVD;
1744                type = NES_CM_EVENT_MPA_REQ;
1745                atomic_set(&cm_node->passive_state,
1746                           NES_PASSIVE_STATE_INDICATED);
1747                break;
1748        case NES_CM_STATE_MPAREQ_SENT:
1749                cleanup_retrans_entry(cm_node);
1750                if (res_type == NES_MPA_REQUEST_REJECT) {
1751                        type = NES_CM_EVENT_MPA_REJECT;
1752                        cm_node->state = NES_CM_STATE_MPAREJ_RCVD;
1753                } else {
1754                        type = NES_CM_EVENT_CONNECTED;
1755                        cm_node->state = NES_CM_STATE_TSA;
1756                }
1757
1758                break;
1759        default:
1760                WARN_ON(1);
1761                break;
1762        }
1763        dev_kfree_skb_any(skb);
1764        create_event(cm_node, type);
1765}
1766
1767static void indicate_pkt_err(struct nes_cm_node *cm_node, struct sk_buff *skb)
1768{
1769        switch (cm_node->state) {
1770        case NES_CM_STATE_SYN_SENT:
1771        case NES_CM_STATE_MPAREQ_SENT:
1772                nes_debug(NES_DBG_CM, "%s[%u] create abort for cm_node=%p "
1773                          "listener=%p state=%d\n", __func__, __LINE__, cm_node,
1774                          cm_node->listener, cm_node->state);
1775                active_open_err(cm_node, skb, 1);
1776                break;
1777        case NES_CM_STATE_ESTABLISHED:
1778        case NES_CM_STATE_SYN_RCVD:
1779                passive_open_err(cm_node, skb, 1);
1780                break;
1781        case NES_CM_STATE_TSA:
1782        default:
1783                drop_packet(skb);
1784        }
1785}
1786
1787static int check_syn(struct nes_cm_node *cm_node, struct tcphdr *tcph,
1788                     struct sk_buff *skb)
1789{
1790        int err;
1791
1792        err = ((ntohl(tcph->ack_seq) == cm_node->tcp_cntxt.loc_seq_num)) ? 0 : 1;
1793        if (err)
1794                active_open_err(cm_node, skb, 1);
1795
1796        return err;
1797}
1798
1799static int check_seq(struct nes_cm_node *cm_node, struct tcphdr *tcph,
1800                     struct sk_buff *skb)
1801{
1802        int err = 0;
1803        u32 seq;
1804        u32 ack_seq;
1805        u32 loc_seq_num = cm_node->tcp_cntxt.loc_seq_num;
1806        u32 rcv_nxt = cm_node->tcp_cntxt.rcv_nxt;
1807        u32 rcv_wnd;
1808
1809        seq = ntohl(tcph->seq);
1810        ack_seq = ntohl(tcph->ack_seq);
1811        rcv_wnd = cm_node->tcp_cntxt.rcv_wnd;
1812        if (ack_seq != loc_seq_num)
1813                err = 1;
1814        else if (!between(seq, rcv_nxt, (rcv_nxt + rcv_wnd)))
1815                err = 1;
1816        if (err) {
1817                nes_debug(NES_DBG_CM, "%s[%u] create abort for cm_node=%p "
1818                          "listener=%p state=%d\n", __func__, __LINE__, cm_node,
1819                          cm_node->listener, cm_node->state);
1820                indicate_pkt_err(cm_node, skb);
1821                nes_debug(NES_DBG_CM, "seq ERROR cm_node =%p seq=0x%08X "
1822                          "rcv_nxt=0x%08X rcv_wnd=0x%x\n", cm_node, seq, rcv_nxt,
1823                          rcv_wnd);
1824        }
1825        return err;
1826}
1827
1828/*
1829 * handle_syn_pkt() is for Passive node. The syn packet is received when a node
1830 * is created with a listener or it may comein as rexmitted packet which in
1831 * that case will be just dropped.
1832 */
1833static void handle_syn_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb,
1834                           struct tcphdr *tcph)
1835{
1836        int ret;
1837        u32 inc_sequence;
1838        int optionsize;
1839
1840        optionsize = (tcph->doff << 2) - sizeof(struct tcphdr);
1841        skb_trim(skb, 0);
1842        inc_sequence = ntohl(tcph->seq);
1843
1844        switch (cm_node->state) {
1845        case NES_CM_STATE_SYN_SENT:
1846        case NES_CM_STATE_MPAREQ_SENT:
1847                /* Rcvd syn on active open connection*/
1848                active_open_err(cm_node, skb, 1);
1849                break;
1850        case NES_CM_STATE_LISTENING:
1851                /* Passive OPEN */
1852                if (atomic_read(&cm_node->listener->pend_accepts_cnt) >
1853                    cm_node->listener->backlog) {
1854                        nes_debug(NES_DBG_CM, "drop syn due to backlog "
1855                                  "pressure \n");
1856                        cm_backlog_drops++;
1857                        passive_open_err(cm_node, skb, 0);
1858                        break;
1859                }
1860                ret = handle_tcp_options(cm_node, tcph, skb, optionsize,
1861                                         1);
1862                if (ret) {
1863                        passive_open_err(cm_node, skb, 0);
1864                        /* drop pkt */
1865                        break;
1866                }
1867                cm_node->tcp_cntxt.rcv_nxt = inc_sequence + 1;
1868                BUG_ON(cm_node->send_entry);
1869                cm_node->accept_pend = 1;
1870                atomic_inc(&cm_node->listener->pend_accepts_cnt);
1871
1872                cm_node->state = NES_CM_STATE_SYN_RCVD;
1873                send_syn(cm_node, 1, skb);
1874                break;
1875        case NES_CM_STATE_CLOSED:
1876                cleanup_retrans_entry(cm_node);
1877                add_ref_cm_node(cm_node);
1878                send_reset(cm_node, skb);
1879                break;
1880        case NES_CM_STATE_TSA:
1881        case NES_CM_STATE_ESTABLISHED:
1882        case NES_CM_STATE_FIN_WAIT1:
1883        case NES_CM_STATE_FIN_WAIT2:
1884        case NES_CM_STATE_MPAREQ_RCVD:
1885        case NES_CM_STATE_LAST_ACK:
1886        case NES_CM_STATE_CLOSING:
1887        case NES_CM_STATE_UNKNOWN:
1888        default:
1889                drop_packet(skb);
1890                break;
1891        }
1892}
1893
1894static void handle_synack_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb,
1895                              struct tcphdr *tcph)
1896{
1897        int ret;
1898        u32 inc_sequence;
1899        int optionsize;
1900
1901        optionsize = (tcph->doff << 2) - sizeof(struct tcphdr);
1902        skb_trim(skb, 0);
1903        inc_sequence = ntohl(tcph->seq);
1904        switch (cm_node->state) {
1905        case NES_CM_STATE_SYN_SENT:
1906                cleanup_retrans_entry(cm_node);
1907                /* active open */
1908                if (check_syn(cm_node, tcph, skb))
1909                        return;
1910                cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq);
1911                /* setup options */
1912                ret = handle_tcp_options(cm_node, tcph, skb, optionsize, 0);
1913                if (ret) {
1914                        nes_debug(NES_DBG_CM, "cm_node=%p tcp_options failed\n",
1915                                  cm_node);
1916                        break;
1917                }
1918                cleanup_retrans_entry(cm_node);
1919                cm_node->tcp_cntxt.rcv_nxt = inc_sequence + 1;
1920                send_mpa_request(cm_node, skb);
1921                cm_node->state = NES_CM_STATE_MPAREQ_SENT;
1922                break;
1923        case NES_CM_STATE_MPAREQ_RCVD:
1924                /* passive open, so should not be here */
1925                passive_open_err(cm_node, skb, 1);
1926                break;
1927        case NES_CM_STATE_LISTENING:
1928                cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq);
1929                cleanup_retrans_entry(cm_node);
1930                cm_node->state = NES_CM_STATE_CLOSED;
1931                send_reset(cm_node, skb);
1932                break;
1933        case NES_CM_STATE_CLOSED:
1934                cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq);
1935                cleanup_retrans_entry(cm_node);
1936                add_ref_cm_node(cm_node);
1937                send_reset(cm_node, skb);
1938                break;
1939        case NES_CM_STATE_ESTABLISHED:
1940        case NES_CM_STATE_FIN_WAIT1:
1941        case NES_CM_STATE_FIN_WAIT2:
1942        case NES_CM_STATE_LAST_ACK:
1943        case NES_CM_STATE_TSA:
1944        case NES_CM_STATE_CLOSING:
1945        case NES_CM_STATE_UNKNOWN:
1946        case NES_CM_STATE_MPAREQ_SENT:
1947        default:
1948                drop_packet(skb);
1949                break;
1950        }
1951}
1952
1953static int handle_ack_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb,
1954                          struct tcphdr *tcph)
1955{
1956        int datasize = 0;
1957        u32 inc_sequence;
1958        int ret = 0;
1959        int optionsize;
1960
1961        optionsize = (tcph->doff << 2) - sizeof(struct tcphdr);
1962
1963        if (check_seq(cm_node, tcph, skb))
1964                return -EINVAL;
1965
1966        skb_pull(skb, tcph->doff << 2);
1967        inc_sequence = ntohl(tcph->seq);
1968        datasize = skb->len;
1969        switch (cm_node->state) {
1970        case NES_CM_STATE_SYN_RCVD:
1971                /* Passive OPEN */
1972                cleanup_retrans_entry(cm_node);
1973                ret = handle_tcp_options(cm_node, tcph, skb, optionsize, 1);
1974                if (ret)
1975                        break;
1976                cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq);
1977                cm_node->state = NES_CM_STATE_ESTABLISHED;
1978                if (datasize) {
1979                        cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize;
1980                        handle_rcv_mpa(cm_node, skb);
1981                } else { /* rcvd ACK only */
1982                        dev_kfree_skb_any(skb);
1983                }
1984                break;
1985        case NES_CM_STATE_ESTABLISHED:
1986                /* Passive OPEN */
1987                cleanup_retrans_entry(cm_node);
1988                if (datasize) {
1989                        cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize;
1990                        handle_rcv_mpa(cm_node, skb);
1991                } else {
1992                        drop_packet(skb);
1993                }
1994                break;
1995        case NES_CM_STATE_MPAREQ_SENT:
1996                cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq);
1997                if (datasize) {
1998                        cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize;
1999                        handle_rcv_mpa(cm_node, skb);
2000                } else { /* Could be just an ack pkt.. */
2001                        dev_kfree_skb_any(skb);
2002                }
2003                break;
2004        case NES_CM_STATE_LISTENING:
2005                cleanup_retrans_entry(cm_node);
2006                cm_node->state = NES_CM_STATE_CLOSED;
2007                send_reset(cm_node, skb);
2008                break;
2009        case NES_CM_STATE_CLOSED:
2010                cleanup_retrans_entry(cm_node);
2011                add_ref_cm_node(cm_node);
2012                send_reset(cm_node, skb);
2013                break;
2014        case NES_CM_STATE_LAST_ACK:
2015        case NES_CM_STATE_CLOSING:
2016                cleanup_retrans_entry(cm_node);
2017                cm_node->state = NES_CM_STATE_CLOSED;
2018                cm_node->cm_id->rem_ref(cm_node->cm_id);
2019                rem_ref_cm_node(cm_node->cm_core, cm_node);
2020                drop_packet(skb);
2021                break;
2022        case NES_CM_STATE_FIN_WAIT1:
2023                cleanup_retrans_entry(cm_node);
2024                drop_packet(skb);
2025                cm_node->state = NES_CM_STATE_FIN_WAIT2;
2026                break;
2027        case NES_CM_STATE_SYN_SENT:
2028        case NES_CM_STATE_FIN_WAIT2:
2029        case NES_CM_STATE_TSA:
2030        case NES_CM_STATE_MPAREQ_RCVD:
2031        case NES_CM_STATE_UNKNOWN:
2032        default:
2033                cleanup_retrans_entry(cm_node);
2034                drop_packet(skb);
2035                break;
2036        }
2037        return ret;
2038}
2039
2040
2041
2042static int handle_tcp_options(struct nes_cm_node *cm_node, struct tcphdr *tcph,
2043                              struct sk_buff *skb, int optionsize, int passive)
2044{
2045        u8 *optionsloc = (u8 *)&tcph[1];
2046
2047        if (optionsize) {
2048                if (process_options(cm_node, optionsloc, optionsize,
2049                                    (u32)tcph->syn)) {
2050                        nes_debug(NES_DBG_CM, "%s: Node %p, Sending RESET\n",
2051                                  __func__, cm_node);
2052                        if (passive)
2053                                passive_open_err(cm_node, skb, 1);
2054                        else
2055                                active_open_err(cm_node, skb, 1);
2056                        return 1;
2057                }
2058        }
2059
2060        cm_node->tcp_cntxt.snd_wnd = ntohs(tcph->window) <<
2061                                     cm_node->tcp_cntxt.snd_wscale;
2062
2063        if (cm_node->tcp_cntxt.snd_wnd > cm_node->tcp_cntxt.max_snd_wnd)
2064                cm_node->tcp_cntxt.max_snd_wnd = cm_node->tcp_cntxt.snd_wnd;
2065        return 0;
2066}
2067
2068/*
2069 * active_open_err() will send reset() if flag set..
2070 * It will also send ABORT event.
2071 */
2072static void active_open_err(struct nes_cm_node *cm_node, struct sk_buff *skb,
2073                            int reset)
2074{
2075        cleanup_retrans_entry(cm_node);
2076        if (reset) {
2077                nes_debug(NES_DBG_CM, "ERROR active err called for cm_node=%p, "
2078                          "state=%d\n", cm_node, cm_node->state);
2079                add_ref_cm_node(cm_node);
2080                send_reset(cm_node, skb);
2081        } else {
2082                dev_kfree_skb_any(skb);
2083        }
2084
2085        cm_node->state = NES_CM_STATE_CLOSED;
2086        create_event(cm_node, NES_CM_EVENT_ABORTED);
2087}
2088
2089/*
2090 * passive_open_err() will either do a reset() or will free up the skb and
2091 * remove the cm_node.
2092 */
2093static void passive_open_err(struct nes_cm_node *cm_node, struct sk_buff *skb,
2094                             int reset)
2095{
2096        cleanup_retrans_entry(cm_node);
2097        cm_node->state = NES_CM_STATE_CLOSED;
2098        if (reset) {
2099                nes_debug(NES_DBG_CM, "passive_open_err sending RST for "
2100                          "cm_node=%p state =%d\n", cm_node, cm_node->state);
2101                send_reset(cm_node, skb);
2102        } else {
2103                dev_kfree_skb_any(skb);
2104                rem_ref_cm_node(cm_node->cm_core, cm_node);
2105        }
2106}
2107
2108/*
2109 * free_retrans_entry() routines assumes that the retrans_list_lock has
2110 * been acquired before calling.
2111 */
2112static void free_retrans_entry(struct nes_cm_node *cm_node)
2113{
2114        struct nes_timer_entry *send_entry;
2115
2116        send_entry = cm_node->send_entry;
2117        if (send_entry) {
2118                cm_node->send_entry = NULL;
2119                dev_kfree_skb_any(send_entry->skb);
2120                kfree(send_entry);
2121                rem_ref_cm_node(cm_node->cm_core, cm_node);
2122        }
2123}
2124
2125static void cleanup_retrans_entry(struct nes_cm_node *cm_node)
2126{
2127        unsigned long flags;
2128
2129        spin_lock_irqsave(&cm_node->retrans_list_lock, flags);
2130        free_retrans_entry(cm_node);
2131        spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);
2132}
2133
2134/**
2135 * process_packet
2136 * Returns skb if to be freed, else it will return NULL if already used..
2137 */
2138static void process_packet(struct nes_cm_node *cm_node, struct sk_buff *skb,
2139                           struct nes_cm_core *cm_core)
2140{
2141        enum nes_tcpip_pkt_type pkt_type = NES_PKT_TYPE_UNKNOWN;
2142        struct tcphdr *tcph = tcp_hdr(skb);
2143        u32 fin_set = 0;
2144        int ret = 0;
2145
2146        skb_pull(skb, ip_hdr(skb)->ihl << 2);
2147
2148        nes_debug(NES_DBG_CM, "process_packet: cm_node=%p state =%d syn=%d "
2149                  "ack=%d rst=%d fin=%d\n", cm_node, cm_node->state, tcph->syn,
2150                  tcph->ack, tcph->rst, tcph->fin);
2151
2152        if (tcph->rst) {
2153                pkt_type = NES_PKT_TYPE_RST;
2154        } else if (tcph->syn) {
2155                pkt_type = NES_PKT_TYPE_SYN;
2156                if (tcph->ack)
2157                        pkt_type = NES_PKT_TYPE_SYNACK;
2158        } else if (tcph->ack) {
2159                pkt_type = NES_PKT_TYPE_ACK;
2160        }
2161        if (tcph->fin)
2162                fin_set = 1;
2163
2164        switch (pkt_type) {
2165        case NES_PKT_TYPE_SYN:
2166                handle_syn_pkt(cm_node, skb, tcph);
2167                break;
2168        case NES_PKT_TYPE_SYNACK:
2169                handle_synack_pkt(cm_node, skb, tcph);
2170                break;
2171        case NES_PKT_TYPE_ACK:
2172                ret = handle_ack_pkt(cm_node, skb, tcph);
2173                if (fin_set && !ret)
2174                        handle_fin_pkt(cm_node);
2175                break;
2176        case NES_PKT_TYPE_RST:
2177                handle_rst_pkt(cm_node, skb, tcph);
2178                break;
2179        default:
2180                if ((fin_set) && (!check_seq(cm_node, tcph, skb)))
2181                        handle_fin_pkt(cm_node);
2182                drop_packet(skb);
2183                break;
2184        }
2185}
2186
2187/**
2188 * mini_cm_listen - create a listen node with params
2189 */
2190static struct nes_cm_listener *mini_cm_listen(struct nes_cm_core *cm_core,
2191                                              struct nes_vnic *nesvnic, struct nes_cm_info *cm_info)
2192{
2193        struct nes_cm_listener *listener;
2194        unsigned long flags;
2195
2196        nes_debug(NES_DBG_CM, "Search for 0x%08x : 0x%04x\n",
2197                  cm_info->loc_addr, cm_info->loc_port);
2198
2199        /* cannot have multiple matching listeners */
2200        listener = find_listener(cm_core, htonl(cm_info->loc_addr),
2201                                 htons(cm_info->loc_port), NES_CM_LISTENER_EITHER_STATE);
2202        if (listener && listener->listener_state == NES_CM_LISTENER_ACTIVE_STATE) {
2203                /* find automatically incs ref count ??? */
2204                atomic_dec(&listener->ref_count);
2205                nes_debug(NES_DBG_CM, "Not creating listener since it already exists\n");
2206                return NULL;
2207        }
2208
2209        if (!listener) {
2210                /* create a CM listen node (1/2 node to compare incoming traffic to) */
2211                listener = kzalloc(sizeof(*listener), GFP_ATOMIC);
2212                if (!listener) {
2213                        nes_debug(NES_DBG_CM, "Not creating listener memory allocation failed\n");
2214                        return NULL;
2215                }
2216
2217                listener->loc_addr = htonl(cm_info->loc_addr);
2218                listener->loc_port = htons(cm_info->loc_port);
2219                listener->reused_node = 0;
2220
2221                atomic_set(&listener->ref_count, 1);
2222        }
2223        /* pasive case */
2224        /* find already inc'ed the ref count */
2225        else {
2226                listener->reused_node = 1;
2227        }
2228
2229        listener->cm_id = cm_info->cm_id;
2230        atomic_set(&listener->pend_accepts_cnt, 0);
2231        listener->cm_core = cm_core;
2232        listener->nesvnic = nesvnic;
2233        atomic_inc(&cm_core->node_cnt);
2234
2235        listener->conn_type = cm_info->conn_type;
2236        listener->backlog = cm_info->backlog;
2237        listener->listener_state = NES_CM_LISTENER_ACTIVE_STATE;
2238
2239        if (!listener->reused_node) {
2240                spin_lock_irqsave(&cm_core->listen_list_lock, flags);
2241                list_add(&listener->list, &cm_core->listen_list.list);
2242                spin_unlock_irqrestore(&cm_core->listen_list_lock, flags);
2243                atomic_inc(&cm_core->listen_node_cnt);
2244        }
2245
2246        nes_debug(NES_DBG_CM, "Api - listen(): addr=0x%08X, port=0x%04x,"
2247                  " listener = %p, backlog = %d, cm_id = %p.\n",
2248                  cm_info->loc_addr, cm_info->loc_port,
2249                  listener, listener->backlog, listener->cm_id);
2250
2251        return listener;
2252}
2253
2254
2255/**
2256 * mini_cm_connect - make a connection node with params
2257 */
2258static struct nes_cm_node *mini_cm_connect(struct nes_cm_core *cm_core,
2259                                           struct nes_vnic *nesvnic, u16 private_data_len,
2260                                           void *private_data, struct nes_cm_info *cm_info)
2261{
2262        int ret = 0;
2263        struct nes_cm_node *cm_node;
2264        struct nes_cm_listener *loopbackremotelistener;
2265        struct nes_cm_node *loopbackremotenode;
2266        struct nes_cm_info loopback_cm_info;
2267        u8 *start_buff;
2268
2269        /* create a CM connection node */
2270        cm_node = make_cm_node(cm_core, nesvnic, cm_info, NULL);
2271        if (!cm_node)
2272                return NULL;
2273
2274        /* set our node side to client (active) side */
2275        cm_node->tcp_cntxt.client = 1;
2276        cm_node->tcp_cntxt.rcv_wscale = NES_CM_DEFAULT_RCV_WND_SCALE;
2277
2278        if (cm_info->loc_addr == cm_info->rem_addr) {
2279                loopbackremotelistener = find_listener(cm_core,
2280                                                       ntohl(nesvnic->local_ipaddr), cm_node->rem_port,
2281                                                       NES_CM_LISTENER_ACTIVE_STATE);
2282                if (loopbackremotelistener == NULL) {
2283                        create_event(cm_node, NES_CM_EVENT_ABORTED);
2284                } else {
2285                        loopback_cm_info = *cm_info;
2286                        loopback_cm_info.loc_port = cm_info->rem_port;
2287                        loopback_cm_info.rem_port = cm_info->loc_port;
2288                        loopback_cm_info.cm_id = loopbackremotelistener->cm_id;
2289                        loopbackremotenode = make_cm_node(cm_core, nesvnic,
2290                                                          &loopback_cm_info, loopbackremotelistener);
2291                        if (!loopbackremotenode) {
2292                                rem_ref_cm_node(cm_node->cm_core, cm_node);
2293                                return NULL;
2294                        }
2295                        atomic_inc(&cm_loopbacks);
2296                        loopbackremotenode->loopbackpartner = cm_node;
2297                        loopbackremotenode->tcp_cntxt.rcv_wscale =
2298                                NES_CM_DEFAULT_RCV_WND_SCALE;
2299                        cm_node->loopbackpartner = loopbackremotenode;
2300                        memcpy(loopbackremotenode->mpa_frame_buf, private_data,
2301                               private_data_len);
2302                        loopbackremotenode->mpa_frame_size = private_data_len;
2303
2304                        /* we are done handling this state. */
2305                        /* set node to a TSA state */
2306                        cm_node->state = NES_CM_STATE_TSA;
2307                        cm_node->tcp_cntxt.rcv_nxt =
2308                                loopbackremotenode->tcp_cntxt.loc_seq_num;
2309                        loopbackremotenode->tcp_cntxt.rcv_nxt =
2310                                cm_node->tcp_cntxt.loc_seq_num;
2311                        cm_node->tcp_cntxt.max_snd_wnd =
2312                                loopbackremotenode->tcp_cntxt.rcv_wnd;
2313                        loopbackremotenode->tcp_cntxt.max_snd_wnd =
2314                                cm_node->tcp_cntxt.rcv_wnd;
2315                        cm_node->tcp_cntxt.snd_wnd =
2316                                loopbackremotenode->tcp_cntxt.rcv_wnd;
2317                        loopbackremotenode->tcp_cntxt.snd_wnd =
2318                                cm_node->tcp_cntxt.rcv_wnd;
2319                        cm_node->tcp_cntxt.snd_wscale =
2320                                loopbackremotenode->tcp_cntxt.rcv_wscale;
2321                        loopbackremotenode->tcp_cntxt.snd_wscale =
2322                                cm_node->tcp_cntxt.rcv_wscale;
2323                        loopbackremotenode->state = NES_CM_STATE_MPAREQ_RCVD;
2324                        create_event(loopbackremotenode, NES_CM_EVENT_MPA_REQ);
2325                }
2326                return cm_node;
2327        }
2328
2329        start_buff = &cm_node->mpa_frame_buf[0] + sizeof(struct ietf_mpa_v2);
2330        cm_node->mpa_frame_size = private_data_len;
2331
2332        memcpy(start_buff, private_data, private_data_len);
2333
2334        /* send a syn and goto syn sent state */
2335        cm_node->state = NES_CM_STATE_SYN_SENT;
2336        ret = send_syn(cm_node, 0, NULL);
2337
2338        if (ret) {
2339                /* error in sending the syn free up the cm_node struct */
2340                nes_debug(NES_DBG_CM, "Api - connect() FAILED: dest "
2341                          "addr=0x%08X, port=0x%04x, cm_node=%p, cm_id = %p.\n",
2342                          cm_node->rem_addr, cm_node->rem_port, cm_node,
2343                          cm_node->cm_id);
2344                rem_ref_cm_node(cm_node->cm_core, cm_node);
2345                cm_node = NULL;
2346        }
2347
2348        if (cm_node) {
2349                nes_debug(NES_DBG_CM, "Api - connect(): dest addr=0x%08X,"
2350                          "port=0x%04x, cm_node=%p, cm_id = %p.\n",
2351                          cm_node->rem_addr, cm_node->rem_port, cm_node,
2352                          cm_node->cm_id);
2353        }
2354
2355        return cm_node;
2356}
2357
2358
2359/**
2360 * mini_cm_accept - accept a connection
2361 * This function is never called
2362 */
2363static int mini_cm_accept(struct nes_cm_core *cm_core, struct nes_cm_node *cm_node)
2364{
2365        return 0;
2366}
2367
2368
2369/**
2370 * mini_cm_reject - reject and teardown a connection
2371 */
2372static int mini_cm_reject(struct nes_cm_core *cm_core, struct nes_cm_node *cm_node)
2373{
2374        int ret = 0;
2375        int err = 0;
2376        int passive_state;
2377        struct nes_cm_event event;
2378        struct iw_cm_id *cm_id = cm_node->cm_id;
2379        struct nes_cm_node *loopback = cm_node->loopbackpartner;
2380
2381        nes_debug(NES_DBG_CM, "%s cm_node=%p type=%d state=%d\n",
2382                  __func__, cm_node, cm_node->tcp_cntxt.client, cm_node->state);
2383
2384        if (cm_node->tcp_cntxt.client)
2385                return ret;
2386        cleanup_retrans_entry(cm_node);
2387
2388        if (!loopback) {
2389                passive_state = atomic_add_return(1, &cm_node->passive_state);
2390                if (passive_state == NES_SEND_RESET_EVENT) {
2391                        cm_node->state = NES_CM_STATE_CLOSED;
2392                        rem_ref_cm_node(cm_core, cm_node);
2393                } else {
2394                        if (cm_node->state == NES_CM_STATE_LISTENER_DESTROYED) {
2395                                rem_ref_cm_node(cm_core, cm_node);
2396                        } else {
2397                                ret = send_mpa_reject(cm_node);
2398                                if (ret) {
2399                                        cm_node->state = NES_CM_STATE_CLOSED;
2400                                        err = send_reset(cm_node, NULL);
2401                                        if (err)
2402                                                WARN_ON(1);
2403                                } else {
2404                                        cm_id->add_ref(cm_id);
2405                                }
2406                        }
2407                }
2408        } else {
2409                cm_node->cm_id = NULL;
2410                if (cm_node->state == NES_CM_STATE_LISTENER_DESTROYED) {
2411                        rem_ref_cm_node(cm_core, cm_node);
2412                        rem_ref_cm_node(cm_core, loopback);
2413                } else {
2414                        event.cm_node = loopback;
2415                        event.cm_info.rem_addr = loopback->rem_addr;
2416                        event.cm_info.loc_addr = loopback->loc_addr;
2417                        event.cm_info.rem_port = loopback->rem_port;
2418                        event.cm_info.loc_port = loopback->loc_port;
2419                        event.cm_info.cm_id = loopback->cm_id;
2420                        cm_event_mpa_reject(&event);
2421                        rem_ref_cm_node(cm_core, cm_node);
2422                        loopback->state = NES_CM_STATE_CLOSING;
2423
2424                        cm_id = loopback->cm_id;
2425                        rem_ref_cm_node(cm_core, loopback);
2426                        cm_id->rem_ref(cm_id);
2427                }
2428        }
2429
2430        return ret;
2431}
2432
2433
2434/**
2435 * mini_cm_close
2436 */
2437static int mini_cm_close(struct nes_cm_core *cm_core, struct nes_cm_node *cm_node)
2438{
2439        int ret = 0;
2440
2441        if (!cm_core || !cm_node)
2442                return -EINVAL;
2443
2444        switch (cm_node->state) {
2445        case NES_CM_STATE_SYN_RCVD:
2446        case NES_CM_STATE_SYN_SENT:
2447        case NES_CM_STATE_ONE_SIDE_ESTABLISHED:
2448        case NES_CM_STATE_ESTABLISHED:
2449        case NES_CM_STATE_ACCEPTING:
2450        case NES_CM_STATE_MPAREQ_SENT:
2451        case NES_CM_STATE_MPAREQ_RCVD:
2452                cleanup_retrans_entry(cm_node);
2453                send_reset(cm_node, NULL);
2454                break;
2455        case NES_CM_STATE_CLOSE_WAIT:
2456                cm_node->state = NES_CM_STATE_LAST_ACK;
2457                send_fin(cm_node, NULL);
2458                break;
2459        case NES_CM_STATE_FIN_WAIT1:
2460        case NES_CM_STATE_FIN_WAIT2:
2461        case NES_CM_STATE_LAST_ACK:
2462        case NES_CM_STATE_TIME_WAIT:
2463        case NES_CM_STATE_CLOSING:
2464                ret = -1;
2465                break;
2466        case NES_CM_STATE_LISTENING:
2467                cleanup_retrans_entry(cm_node);
2468                send_reset(cm_node, NULL);
2469                break;
2470        case NES_CM_STATE_MPAREJ_RCVD:
2471        case NES_CM_STATE_UNKNOWN:
2472        case NES_CM_STATE_INITED:
2473        case NES_CM_STATE_CLOSED:
2474        case NES_CM_STATE_LISTENER_DESTROYED:
2475                ret = rem_ref_cm_node(cm_core, cm_node);
2476                break;
2477        case NES_CM_STATE_TSA:
2478                if (cm_node->send_entry)
2479                        printk(KERN_ERR "ERROR Close got called from STATE_TSA "
2480                               "send_entry=%p\n", cm_node->send_entry);
2481                ret = rem_ref_cm_node(cm_core, cm_node);
2482                break;
2483        }
2484        return ret;
2485}
2486
2487
2488/**
2489 * recv_pkt - recv an ETHERNET packet, and process it through CM
2490 * node state machine
2491 */
2492static int mini_cm_recv_pkt(struct nes_cm_core *cm_core,
2493                            struct nes_vnic *nesvnic, struct sk_buff *skb)
2494{
2495        struct nes_cm_node *cm_node = NULL;
2496        struct nes_cm_listener *listener = NULL;
2497        struct iphdr *iph;
2498        struct tcphdr *tcph;
2499        struct nes_cm_info nfo;
2500        int skb_handled = 1;
2501        __be32 tmp_daddr, tmp_saddr;
2502
2503        if (!skb)
2504                return 0;
2505        if (skb->len < sizeof(struct iphdr) + sizeof(struct tcphdr))
2506                return 0;
2507
2508        iph = (struct iphdr *)skb->data;
2509        tcph = (struct tcphdr *)(skb->data + sizeof(struct iphdr));
2510
2511        nfo.loc_addr = ntohl(iph->daddr);
2512        nfo.loc_port = ntohs(tcph->dest);
2513        nfo.rem_addr = ntohl(iph->saddr);
2514        nfo.rem_port = ntohs(tcph->source);
2515
2516        tmp_daddr = cpu_to_be32(iph->daddr);
2517        tmp_saddr = cpu_to_be32(iph->saddr);
2518
2519        nes_debug(NES_DBG_CM, "Received packet: dest=%pI4:0x%04X src=%pI4:0x%04X\n",
2520                  &tmp_daddr, tcph->dest, &tmp_saddr, tcph->source);
2521
2522        do {
2523                cm_node = find_node(cm_core,
2524                                    nfo.rem_port, nfo.rem_addr,
2525                                    nfo.loc_port, nfo.loc_addr);
2526
2527                if (!cm_node) {
2528                        /* Only type of packet accepted are for */
2529                        /* the PASSIVE open (syn only) */
2530                        if ((!tcph->syn) || (tcph->ack)) {
2531                                skb_handled = 0;
2532                                break;
2533                        }
2534                        listener = find_listener(cm_core, nfo.loc_addr,
2535                                                 nfo.loc_port,
2536                                                 NES_CM_LISTENER_ACTIVE_STATE);
2537                        if (!listener) {
2538                                nfo.cm_id = NULL;
2539                                nfo.conn_type = 0;
2540                                nes_debug(NES_DBG_CM, "Unable to find listener for the pkt\n");
2541                                skb_handled = 0;
2542                                break;
2543                        }
2544                        nfo.cm_id = listener->cm_id;
2545                        nfo.conn_type = listener->conn_type;
2546                        cm_node = make_cm_node(cm_core, nesvnic, &nfo,
2547                                               listener);
2548                        if (!cm_node) {
2549                                nes_debug(NES_DBG_CM, "Unable to allocate "
2550                                          "node\n");
2551                                cm_packets_dropped++;
2552                                atomic_dec(&listener->ref_count);
2553                                dev_kfree_skb_any(skb);
2554                                break;
2555                        }
2556                        if (!tcph->rst && !tcph->fin) {
2557                                cm_node->state = NES_CM_STATE_LISTENING;
2558                        } else {
2559                                cm_packets_dropped++;
2560                                rem_ref_cm_node(cm_core, cm_node);
2561                                dev_kfree_skb_any(skb);
2562                                break;
2563                        }
2564                        add_ref_cm_node(cm_node);
2565                } else if (cm_node->state == NES_CM_STATE_TSA) {
2566                        if (cm_node->nesqp->pau_mode)
2567                                nes_queue_mgt_skbs(skb, nesvnic, cm_node->nesqp);
2568                        else {
2569                                rem_ref_cm_node(cm_core, cm_node);
2570                                atomic_inc(&cm_accel_dropped_pkts);
2571                                dev_kfree_skb_any(skb);
2572                        }
2573                        break;
2574                }
2575                skb_reset_network_header(skb);
2576                skb_set_transport_header(skb, sizeof(*tcph));
2577                skb->len = ntohs(iph->tot_len);
2578                process_packet(cm_node, skb, cm_core);
2579                rem_ref_cm_node(cm_core, cm_node);
2580        } while (0);
2581        return skb_handled;
2582}
2583
2584
2585/**
2586 * nes_cm_alloc_core - allocate a top level instance of a cm core
2587 */
2588static struct nes_cm_core *nes_cm_alloc_core(void)
2589{
2590        struct nes_cm_core *cm_core;
2591
2592        /* setup the CM core */
2593        /* alloc top level core control structure */
2594        cm_core = kzalloc(sizeof(*cm_core), GFP_KERNEL);
2595        if (!cm_core)
2596                return NULL;
2597
2598        INIT_LIST_HEAD(&cm_core->connected_nodes);
2599        init_timer(&cm_core->tcp_timer);
2600        cm_core->tcp_timer.function = nes_cm_timer_tick;
2601
2602        cm_core->mtu = NES_CM_DEFAULT_MTU;
2603        cm_core->state = NES_CM_STATE_INITED;
2604        cm_core->free_tx_pkt_max = NES_CM_DEFAULT_FREE_PKTS;
2605
2606        atomic_set(&cm_core->events_posted, 0);
2607
2608        cm_core->api = &nes_cm_api;
2609
2610        spin_lock_init(&cm_core->ht_lock);
2611        spin_lock_init(&cm_core->listen_list_lock);
2612
2613        INIT_LIST_HEAD(&cm_core->listen_list.list);
2614
2615        nes_debug(NES_DBG_CM, "Init CM Core completed -- cm_core=%p\n", cm_core);
2616
2617        nes_debug(NES_DBG_CM, "Enable QUEUE EVENTS\n");
2618        cm_core->event_wq = create_singlethread_workqueue("nesewq");
2619        cm_core->post_event = nes_cm_post_event;
2620        nes_debug(NES_DBG_CM, "Enable QUEUE DISCONNECTS\n");
2621        cm_core->disconn_wq = create_singlethread_workqueue("nesdwq");
2622
2623        print_core(cm_core);
2624        return cm_core;
2625}
2626
2627
2628/**
2629 * mini_cm_dealloc_core - deallocate a top level instance of a cm core
2630 */
2631static int mini_cm_dealloc_core(struct nes_cm_core *cm_core)
2632{
2633        nes_debug(NES_DBG_CM, "De-Alloc CM Core (%p)\n", cm_core);
2634
2635        if (!cm_core)
2636                return -EINVAL;
2637
2638        barrier();
2639
2640        if (timer_pending(&cm_core->tcp_timer))
2641                del_timer(&cm_core->tcp_timer);
2642
2643        destroy_workqueue(cm_core->event_wq);
2644        destroy_workqueue(cm_core->disconn_wq);
2645        nes_debug(NES_DBG_CM, "\n");
2646        kfree(cm_core);
2647
2648        return 0;
2649}
2650
2651
2652/**
2653 * mini_cm_get
2654 */
2655static int mini_cm_get(struct nes_cm_core *cm_core)
2656{
2657        return cm_core->state;
2658}
2659
2660
2661/**
2662 * mini_cm_set
2663 */
2664static int mini_cm_set(struct nes_cm_core *cm_core, u32 type, u32 value)
2665{
2666        int ret = 0;
2667
2668        switch (type) {
2669        case NES_CM_SET_PKT_SIZE:
2670                cm_core->mtu = value;
2671                break;
2672        case NES_CM_SET_FREE_PKT_Q_SIZE:
2673                cm_core->free_tx_pkt_max = value;
2674                break;
2675        default:
2676                /* unknown set option */
2677                ret = -EINVAL;
2678        }
2679
2680        return ret;
2681}
2682
2683
2684/**
2685 * nes_cm_init_tsa_conn setup HW; MPA frames must be
2686 * successfully exchanged when this is called
2687 */
2688static int nes_cm_init_tsa_conn(struct nes_qp *nesqp, struct nes_cm_node *cm_node)
2689{
2690        int ret = 0;
2691
2692        if (!nesqp)
2693                return -EINVAL;
2694
2695        nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_IPV4 |
2696                                                  NES_QPCONTEXT_MISC_NO_NAGLE | NES_QPCONTEXT_MISC_DO_NOT_FRAG |
2697                                                  NES_QPCONTEXT_MISC_DROS);
2698
2699        if (cm_node->tcp_cntxt.snd_wscale || cm_node->tcp_cntxt.rcv_wscale)
2700                nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_WSCALE);
2701
2702        nesqp->nesqp_context->misc2 |= cpu_to_le32(64 << NES_QPCONTEXT_MISC2_TTL_SHIFT);
2703
2704        nesqp->nesqp_context->mss |= cpu_to_le32(((u32)cm_node->tcp_cntxt.mss) << 16);
2705
2706        nesqp->nesqp_context->tcp_state_flow_label |= cpu_to_le32(
2707                (u32)NES_QPCONTEXT_TCPSTATE_EST << NES_QPCONTEXT_TCPFLOW_TCP_STATE_SHIFT);
2708
2709        nesqp->nesqp_context->pd_index_wscale |= cpu_to_le32(
2710                (cm_node->tcp_cntxt.snd_wscale << NES_QPCONTEXT_PDWSCALE_SND_WSCALE_SHIFT) &
2711                NES_QPCONTEXT_PDWSCALE_SND_WSCALE_MASK);
2712
2713        nesqp->nesqp_context->pd_index_wscale |= cpu_to_le32(
2714                (cm_node->tcp_cntxt.rcv_wscale << NES_QPCONTEXT_PDWSCALE_RCV_WSCALE_SHIFT) &
2715                NES_QPCONTEXT_PDWSCALE_RCV_WSCALE_MASK);
2716
2717        nesqp->nesqp_context->keepalive = cpu_to_le32(0x80);
2718        nesqp->nesqp_context->ts_recent = 0;
2719        nesqp->nesqp_context->ts_age = 0;
2720        nesqp->nesqp_context->snd_nxt = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num);
2721        nesqp->nesqp_context->snd_wnd = cpu_to_le32(cm_node->tcp_cntxt.snd_wnd);
2722        nesqp->nesqp_context->rcv_nxt = cpu_to_le32(cm_node->tcp_cntxt.rcv_nxt);
2723        nesqp->nesqp_context->rcv_wnd = cpu_to_le32(cm_node->tcp_cntxt.rcv_wnd <<
2724                                                    cm_node->tcp_cntxt.rcv_wscale);
2725        nesqp->nesqp_context->snd_max = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num);
2726        nesqp->nesqp_context->snd_una = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num);
2727        nesqp->nesqp_context->srtt = 0;
2728        nesqp->nesqp_context->rttvar = cpu_to_le32(0x6);
2729        nesqp->nesqp_context->ssthresh = cpu_to_le32(0x3FFFC000);
2730        nesqp->nesqp_context->cwnd = cpu_to_le32(2 * cm_node->tcp_cntxt.mss);
2731        nesqp->nesqp_context->snd_wl1 = cpu_to_le32(cm_node->tcp_cntxt.rcv_nxt);
2732        nesqp->nesqp_context->snd_wl2 = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num);
2733        nesqp->nesqp_context->max_snd_wnd = cpu_to_le32(cm_node->tcp_cntxt.max_snd_wnd);
2734
2735        nes_debug(NES_DBG_CM, "QP%u: rcv_nxt = 0x%08X, snd_nxt = 0x%08X,"
2736                  " Setting MSS to %u, PDWscale = 0x%08X, rcv_wnd = %u, context misc = 0x%08X.\n",
2737                  nesqp->hwqp.qp_id, le32_to_cpu(nesqp->nesqp_context->rcv_nxt),
2738                  le32_to_cpu(nesqp->nesqp_context->snd_nxt),
2739                  cm_node->tcp_cntxt.mss, le32_to_cpu(nesqp->nesqp_context->pd_index_wscale),
2740                  le32_to_cpu(nesqp->nesqp_context->rcv_wnd),
2741                  le32_to_cpu(nesqp->nesqp_context->misc));
2742        nes_debug(NES_DBG_CM, "  snd_wnd  = 0x%08X.\n", le32_to_cpu(nesqp->nesqp_context->snd_wnd));
2743        nes_debug(NES_DBG_CM, "  snd_cwnd = 0x%08X.\n", le32_to_cpu(nesqp->nesqp_context->cwnd));
2744        nes_debug(NES_DBG_CM, "  max_swnd = 0x%08X.\n", le32_to_cpu(nesqp->nesqp_context->max_snd_wnd));
2745
2746        nes_debug(NES_DBG_CM, "Change cm_node state to TSA\n");
2747        cm_node->state = NES_CM_STATE_TSA;
2748
2749        return ret;
2750}
2751
2752
2753/**
2754 * nes_cm_disconn
2755 */
2756int nes_cm_disconn(struct nes_qp *nesqp)
2757{
2758        struct disconn_work *work;
2759
2760        work = kzalloc(sizeof *work, GFP_ATOMIC);
2761        if (!work)
2762                return -ENOMEM;  /* Timer will clean up */
2763
2764        nes_add_ref(&nesqp->ibqp);
2765        work->nesqp = nesqp;
2766        INIT_WORK(&work->work, nes_disconnect_worker);
2767        queue_work(g_cm_core->disconn_wq, &work->work);
2768        return 0;
2769}
2770
2771
2772/**
2773 * nes_disconnect_worker
2774 */
2775static void nes_disconnect_worker(struct work_struct *work)
2776{
2777        struct disconn_work *dwork = container_of(work, struct disconn_work, work);
2778        struct nes_qp *nesqp = dwork->nesqp;
2779
2780        kfree(dwork);
2781        nes_debug(NES_DBG_CM, "processing AEQE id 0x%04X for QP%u.\n",
2782                  nesqp->last_aeq, nesqp->hwqp.qp_id);
2783        nes_cm_disconn_true(nesqp);
2784        nes_rem_ref(&nesqp->ibqp);
2785}
2786
2787
2788/**
2789 * nes_cm_disconn_true
2790 */
2791static int nes_cm_disconn_true(struct nes_qp *nesqp)
2792{
2793        unsigned long flags;
2794        int ret = 0;
2795        struct iw_cm_id *cm_id;
2796        struct iw_cm_event cm_event;
2797        struct nes_vnic *nesvnic;
2798        u16 last_ae;
2799        u8 original_hw_tcp_state;
2800        u8 original_ibqp_state;
2801        int disconn_status = 0;
2802        int issue_disconn = 0;
2803        int issue_close = 0;
2804        int issue_flush = 0;
2805        u32 flush_q = NES_CQP_FLUSH_RQ;
2806        struct ib_event ibevent;
2807
2808        if (!nesqp) {
2809                nes_debug(NES_DBG_CM, "disconnect_worker nesqp is NULL\n");
2810                return -1;
2811        }
2812
2813        spin_lock_irqsave(&nesqp->lock, flags);
2814        cm_id = nesqp->cm_id;
2815        /* make sure we havent already closed this connection */
2816        if (!cm_id) {
2817                nes_debug(NES_DBG_CM, "QP%u disconnect_worker cmid is NULL\n",
2818                          nesqp->hwqp.qp_id);
2819                spin_unlock_irqrestore(&nesqp->lock, flags);
2820                return -1;
2821        }
2822
2823        nesvnic = to_nesvnic(nesqp->ibqp.device);
2824        nes_debug(NES_DBG_CM, "Disconnecting QP%u\n", nesqp->hwqp.qp_id);
2825
2826        original_hw_tcp_state = nesqp->hw_tcp_state;
2827        original_ibqp_state = nesqp->ibqp_state;
2828        last_ae = nesqp->last_aeq;
2829
2830        if (nesqp->term_flags) {
2831                issue_disconn = 1;
2832                issue_close = 1;
2833                nesqp->cm_id = NULL;
2834                del_timer(&nesqp->terminate_timer);
2835                if (nesqp->flush_issued == 0) {
2836                        nesqp->flush_issued = 1;
2837                        issue_flush = 1;
2838                }
2839        } else if ((original_hw_tcp_state == NES_AEQE_TCP_STATE_CLOSE_WAIT) ||
2840                        ((original_ibqp_state == IB_QPS_RTS) &&
2841                        (last_ae == NES_AEQE_AEID_LLP_CONNECTION_RESET))) {
2842                issue_disconn = 1;
2843                if (last_ae == NES_AEQE_AEID_LLP_CONNECTION_RESET)
2844                        disconn_status = -ECONNRESET;
2845        }
2846
2847        if (((original_hw_tcp_state == NES_AEQE_TCP_STATE_CLOSED) ||
2848                 (original_hw_tcp_state == NES_AEQE_TCP_STATE_TIME_WAIT) ||
2849                 (last_ae == NES_AEQE_AEID_RDMAP_ROE_BAD_LLP_CLOSE) ||
2850                 (last_ae == NES_AEQE_AEID_LLP_CONNECTION_RESET))) {
2851                issue_close = 1;
2852                nesqp->cm_id = NULL;
2853                if (nesqp->flush_issued == 0) {
2854                        nesqp->flush_issued = 1;
2855                        issue_flush = 1;
2856                }
2857        }
2858
2859        spin_unlock_irqrestore(&nesqp->lock, flags);
2860
2861        if ((issue_flush) && (nesqp->destroyed == 0)) {
2862                /* Flush the queue(s) */
2863                if (nesqp->hw_iwarp_state >= NES_AEQE_IWARP_STATE_TERMINATE)
2864                        flush_q |= NES_CQP_FLUSH_SQ;
2865                flush_wqes(nesvnic->nesdev, nesqp, flush_q, 1);
2866
2867                if (nesqp->term_flags) {
2868                        ibevent.device = nesqp->ibqp.device;
2869                        ibevent.event = nesqp->terminate_eventtype;
2870                        ibevent.element.qp = &nesqp->ibqp;
2871                        if (nesqp->ibqp.event_handler)
2872                                nesqp->ibqp.event_handler(&ibevent, nesqp->ibqp.qp_context);
2873                }
2874        }
2875
2876        if ((cm_id) && (cm_id->event_handler)) {
2877                if (issue_disconn) {
2878                        atomic_inc(&cm_disconnects);
2879                        cm_event.event = IW_CM_EVENT_DISCONNECT;
2880                        cm_event.status = disconn_status;
2881                        cm_event.local_addr = cm_id->local_addr;
2882                        cm_event.remote_addr = cm_id->remote_addr;
2883                        cm_event.private_data = NULL;
2884                        cm_event.private_data_len = 0;
2885
2886                        nes_debug(NES_DBG_CM, "Generating a CM Disconnect Event"
2887                                  " for  QP%u, SQ Head = %u, SQ Tail = %u. "
2888                                  "cm_id = %p, refcount = %u.\n",
2889                                  nesqp->hwqp.qp_id, nesqp->hwqp.sq_head,
2890                                  nesqp->hwqp.sq_tail, cm_id,
2891                                  atomic_read(&nesqp->refcount));
2892
2893                        ret = cm_id->event_handler(cm_id, &cm_event);
2894                        if (ret)
2895                                nes_debug(NES_DBG_CM, "OFA CM event_handler "
2896                                          "returned, ret=%d\n", ret);
2897                }
2898
2899                if (issue_close) {
2900                        atomic_inc(&cm_closes);
2901                        nes_disconnect(nesqp, 1);
2902
2903                        cm_id->provider_data = nesqp;
2904                        /* Send up the close complete event */
2905                        cm_event.event = IW_CM_EVENT_CLOSE;
2906                        cm_event.status = 0;
2907                        cm_event.provider_data = cm_id->provider_data;
2908                        cm_event.local_addr = cm_id->local_addr;
2909                        cm_event.remote_addr = cm_id->remote_addr;
2910                        cm_event.private_data = NULL;
2911                        cm_event.private_data_len = 0;
2912
2913                        ret = cm_id->event_handler(cm_id, &cm_event);
2914                        if (ret)
2915                                nes_debug(NES_DBG_CM, "OFA CM event_handler returned, ret=%d\n", ret);
2916
2917                        cm_id->rem_ref(cm_id);
2918                }
2919        }
2920
2921        return 0;
2922}
2923
2924
2925/**
2926 * nes_disconnect
2927 */
2928static int nes_disconnect(struct nes_qp *nesqp, int abrupt)
2929{
2930        int ret = 0;
2931        struct nes_vnic *nesvnic;
2932        struct nes_device *nesdev;
2933        struct nes_ib_device *nesibdev;
2934
2935        nesvnic = to_nesvnic(nesqp->ibqp.device);
2936        if (!nesvnic)
2937                return -EINVAL;
2938
2939        nesdev = nesvnic->nesdev;
2940        nesibdev = nesvnic->nesibdev;
2941
2942        nes_debug(NES_DBG_CM, "netdev refcnt = %u.\n",
2943                        netdev_refcnt_read(nesvnic->netdev));
2944
2945        if (nesqp->active_conn) {
2946
2947                /* indicate this connection is NOT active */
2948                nesqp->active_conn = 0;
2949        } else {
2950                /* Need to free the Last Streaming Mode Message */
2951                if (nesqp->ietf_frame) {
2952                        if (nesqp->lsmm_mr)
2953                                nesibdev->ibdev.dereg_mr(nesqp->lsmm_mr);
2954                        pci_free_consistent(nesdev->pcidev,
2955                                            nesqp->private_data_len + nesqp->ietf_frame_size,
2956                                            nesqp->ietf_frame, nesqp->ietf_frame_pbase);
2957                }
2958        }
2959
2960        /* close the CM node down if it is still active */
2961        if (nesqp->cm_node) {
2962                nes_debug(NES_DBG_CM, "Call close API\n");
2963
2964                g_cm_core->api->close(g_cm_core, nesqp->cm_node);
2965        }
2966
2967        return ret;
2968}
2969
2970
2971/**
2972 * nes_accept
2973 */
2974int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
2975{
2976        u64 u64temp;
2977        struct ib_qp *ibqp;
2978        struct nes_qp *nesqp;
2979        struct nes_vnic *nesvnic;
2980        struct nes_device *nesdev;
2981        struct nes_cm_node *cm_node;
2982        struct nes_adapter *adapter;
2983        struct ib_qp_attr attr;
2984        struct iw_cm_event cm_event;
2985        struct nes_hw_qp_wqe *wqe;
2986        struct nes_v4_quad nes_quad;
2987        u32 crc_value;
2988        int ret;
2989        int passive_state;
2990        struct nes_ib_device *nesibdev;
2991        struct ib_mr *ibmr = NULL;
2992        struct ib_phys_buf ibphysbuf;
2993        struct nes_pd *nespd;
2994        u64 tagged_offset;
2995        u8 mpa_frame_offset = 0;
2996        struct ietf_mpa_v2 *mpa_v2_frame;
2997        u8 start_addr = 0;
2998        u8 *start_ptr = &start_addr;
2999        u8 **start_buff = &start_ptr;
3000        u16 buff_len = 0;
3001
3002        ibqp = nes_get_qp(cm_id->device, conn_param->qpn);
3003        if (!ibqp)
3004                return -EINVAL;
3005
3006        /* get all our handles */
3007        nesqp = to_nesqp(ibqp);
3008        nesvnic = to_nesvnic(nesqp->ibqp.device);
3009        nesdev = nesvnic->nesdev;
3010        adapter = nesdev->nesadapter;
3011
3012        cm_node = (struct nes_cm_node *)cm_id->provider_data;
3013        nes_debug(NES_DBG_CM, "nes_accept: cm_node= %p nesvnic=%p, netdev=%p,"
3014                "%s\n", cm_node, nesvnic, nesvnic->netdev,
3015                nesvnic->netdev->name);
3016
3017        if (NES_CM_STATE_LISTENER_DESTROYED == cm_node->state) {
3018                if (cm_node->loopbackpartner)
3019                        rem_ref_cm_node(cm_node->cm_core, cm_node->loopbackpartner);
3020                rem_ref_cm_node(cm_node->cm_core, cm_node);
3021                return -EINVAL;
3022        }
3023
3024        passive_state = atomic_add_return(1, &cm_node->passive_state);
3025        if (passive_state == NES_SEND_RESET_EVENT) {
3026                rem_ref_cm_node(cm_node->cm_core, cm_node);
3027                return -ECONNRESET;
3028        }
3029
3030        /* associate the node with the QP */
3031        nesqp->cm_node = (void *)cm_node;
3032        cm_node->nesqp = nesqp;
3033
3034        nes_debug(NES_DBG_CM, "QP%u, cm_node=%p, jiffies = %lu listener = %p\n",
3035                nesqp->hwqp.qp_id, cm_node, jiffies, cm_node->listener);
3036        atomic_inc(&cm_accepts);
3037
3038        nes_debug(NES_DBG_CM, "netdev refcnt = %u.\n",
3039                        netdev_refcnt_read(nesvnic->netdev));
3040
3041        nesqp->ietf_frame_size = sizeof(struct ietf_mpa_v2);
3042        /* allocate the ietf frame and space for private data */
3043        nesqp->ietf_frame = pci_alloc_consistent(nesdev->pcidev,
3044                                                 nesqp->ietf_frame_size + conn_param->private_data_len,
3045                                                 &nesqp->ietf_frame_pbase);
3046
3047        if (!nesqp->ietf_frame) {
3048                nes_debug(NES_DBG_CM, "Unable to allocate memory for private data\n");
3049                return -ENOMEM;
3050        }
3051        mpa_v2_frame = (struct ietf_mpa_v2 *)nesqp->ietf_frame;
3052
3053        if (cm_node->mpa_frame_rev == IETF_MPA_V1)
3054                mpa_frame_offset = 4;
3055
3056        memcpy(mpa_v2_frame->priv_data, conn_param->private_data,
3057               conn_param->private_data_len);
3058
3059        cm_build_mpa_frame(cm_node, start_buff, &buff_len, nesqp->ietf_frame, MPA_KEY_REPLY);
3060        nesqp->private_data_len = conn_param->private_data_len;
3061
3062        /* setup our first outgoing iWarp send WQE (the IETF frame response) */
3063        wqe = &nesqp->hwqp.sq_vbase[0];
3064
3065        if (cm_id->remote_addr.sin_addr.s_addr !=
3066            cm_id->local_addr.sin_addr.s_addr) {
3067                u64temp = (unsigned long)nesqp;
3068                nesibdev = nesvnic->nesibdev;
3069                nespd = nesqp->nespd;
3070                ibphysbuf.addr = nesqp->ietf_frame_pbase + mpa_frame_offset;
3071                ibphysbuf.size = buff_len;
3072                tagged_offset = (u64)(unsigned long)*start_buff;
3073                ibmr = nesibdev->ibdev.reg_phys_mr((struct ib_pd *)nespd,
3074                                                   &ibphysbuf, 1,
3075                                                   IB_ACCESS_LOCAL_WRITE,
3076                                                   &tagged_offset);
3077                if (!ibmr) {
3078                        nes_debug(NES_DBG_CM, "Unable to register memory region"
3079                                  "for lSMM for cm_node = %p \n",
3080                                  cm_node);
3081                        pci_free_consistent(nesdev->pcidev,
3082                                            nesqp->private_data_len + nesqp->ietf_frame_size,
3083                                            nesqp->ietf_frame, nesqp->ietf_frame_pbase);
3084                        return -ENOMEM;
3085                }
3086
3087                ibmr->pd = &nespd->ibpd;
3088                ibmr->device = nespd->ibpd.device;
3089                nesqp->lsmm_mr = ibmr;
3090
3091                u64temp |= NES_SW_CONTEXT_ALIGN >> 1;
3092                set_wqe_64bit_value(wqe->wqe_words,
3093                                    NES_IWARP_SQ_WQE_COMP_CTX_LOW_IDX,
3094                                    u64temp);
3095                wqe->wqe_words[NES_IWARP_SQ_WQE_MISC_IDX] =
3096                        cpu_to_le32(NES_IWARP_SQ_WQE_STREAMING |
3097                                    NES_IWARP_SQ_WQE_WRPDU);
3098                wqe->wqe_words[NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX] =
3099                        cpu_to_le32(buff_len);
3100                set_wqe_64bit_value(wqe->wqe_words,
3101                                    NES_IWARP_SQ_WQE_FRAG0_LOW_IDX,
3102                                    (u64)(unsigned long)(*start_buff));
3103                wqe->wqe_words[NES_IWARP_SQ_WQE_LENGTH0_IDX] =
3104                        cpu_to_le32(buff_len);
3105                wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = ibmr->lkey;
3106                if (nesqp->sq_kmapped) {
3107                        nesqp->sq_kmapped = 0;
3108                        kunmap(nesqp->page);
3109                }
3110
3111                nesqp->nesqp_context->ird_ord_sizes |=
3112                        cpu_to_le32(NES_QPCONTEXT_ORDIRD_LSMM_PRESENT |
3113                                    NES_QPCONTEXT_ORDIRD_WRPDU);
3114        } else {
3115                nesqp->nesqp_context->ird_ord_sizes |=
3116                        cpu_to_le32(NES_QPCONTEXT_ORDIRD_WRPDU);
3117        }
3118        nesqp->skip_lsmm = 1;
3119
3120
3121        /* Cache the cm_id in the qp */
3122        nesqp->cm_id = cm_id;
3123        cm_node->cm_id = cm_id;
3124
3125        /*  nesqp->cm_node = (void *)cm_id->provider_data; */
3126        cm_id->provider_data = nesqp;
3127        nesqp->active_conn = 0;
3128
3129        if (cm_node->state == NES_CM_STATE_TSA)
3130                nes_debug(NES_DBG_CM, "Already state = TSA for cm_node=%p\n",
3131                          cm_node);
3132
3133        nes_cm_init_tsa_conn(nesqp, cm_node);
3134
3135        nesqp->nesqp_context->tcpPorts[0] =
3136                cpu_to_le16(ntohs(cm_id->local_addr.sin_port));
3137        nesqp->nesqp_context->tcpPorts[1] =
3138                cpu_to_le16(ntohs(cm_id->remote_addr.sin_port));
3139
3140        nesqp->nesqp_context->ip0 =
3141                        cpu_to_le32(ntohl(cm_id->remote_addr.sin_addr.s_addr));
3142
3143        nesqp->nesqp_context->misc2 |= cpu_to_le32(
3144                (u32)PCI_FUNC(nesdev->pcidev->devfn) <<
3145                NES_QPCONTEXT_MISC2_SRC_IP_SHIFT);
3146
3147        nesqp->nesqp_context->arp_index_vlan |=
3148                cpu_to_le32(nes_arp_table(nesdev,
3149                                          le32_to_cpu(nesqp->nesqp_context->ip0), NULL,
3150                                          NES_ARP_RESOLVE) << 16);
3151
3152        nesqp->nesqp_context->ts_val_delta = cpu_to_le32(
3153                jiffies - nes_read_indexed(nesdev, NES_IDX_TCP_NOW));
3154
3155        nesqp->nesqp_context->ird_index = cpu_to_le32(nesqp->hwqp.qp_id);
3156
3157        nesqp->nesqp_context->ird_ord_sizes |= cpu_to_le32(
3158                ((u32)1 << NES_QPCONTEXT_ORDIRD_IWARP_MODE_SHIFT));
3159        nesqp->nesqp_context->ird_ord_sizes |=
3160                cpu_to_le32((u32)conn_param->ord);
3161
3162        memset(&nes_quad, 0, sizeof(nes_quad));
3163        nes_quad.DstIpAdrIndex =
3164                cpu_to_le32((u32)PCI_FUNC(nesdev->pcidev->devfn) << 24);
3165        nes_quad.SrcIpadr = cm_id->remote_addr.sin_addr.s_addr;
3166        nes_quad.TcpPorts[0] = cm_id->remote_addr.sin_port;
3167        nes_quad.TcpPorts[1] = cm_id->local_addr.sin_port;
3168
3169        /* Produce hash key */
3170        crc_value = get_crc_value(&nes_quad);
3171        nesqp->hte_index = cpu_to_be32(crc_value ^ 0xffffffff);
3172        nes_debug(NES_DBG_CM, "HTE Index = 0x%08X, CRC = 0x%08X\n",
3173                  nesqp->hte_index, nesqp->hte_index & adapter->hte_index_mask);
3174
3175        nesqp->hte_index &= adapter->hte_index_mask;
3176        nesqp->nesqp_context->hte_index = cpu_to_le32(nesqp->hte_index);
3177
3178        cm_node->cm_core->api->accelerated(cm_node->cm_core, cm_node);
3179
3180        nes_debug(NES_DBG_CM, "QP%u, Destination IP = 0x%08X:0x%04X, local = "
3181                  "0x%08X:0x%04X, rcv_nxt=0x%08X, snd_nxt=0x%08X, mpa + "
3182                  "private data length=%u.\n", nesqp->hwqp.qp_id,
3183                  ntohl(cm_id->remote_addr.sin_addr.s_addr),
3184                  ntohs(cm_id->remote_addr.sin_port),
3185                  ntohl(cm_id->local_addr.sin_addr.s_addr),
3186                  ntohs(cm_id->local_addr.sin_port),
3187                  le32_to_cpu(nesqp->nesqp_context->rcv_nxt),
3188                  le32_to_cpu(nesqp->nesqp_context->snd_nxt),
3189                  buff_len);
3190
3191        /* notify OF layer that accept event was successful */
3192        cm_id->add_ref(cm_id);
3193        nes_add_ref(&nesqp->ibqp);
3194
3195        cm_event.event = IW_CM_EVENT_ESTABLISHED;
3196        cm_event.status = 0;
3197        cm_event.provider_data = (void *)nesqp;
3198        cm_event.local_addr = cm_id->local_addr;
3199        cm_event.remote_addr = cm_id->remote_addr;
3200        cm_event.private_data = NULL;
3201        cm_event.private_data_len = 0;
3202        ret = cm_id->event_handler(cm_id, &cm_event);
3203        attr.qp_state = IB_QPS_RTS;
3204        nes_modify_qp(&nesqp->ibqp, &attr, IB_QP_STATE, NULL);
3205        if (cm_node->loopbackpartner) {
3206                cm_node->loopbackpartner->mpa_frame_size =
3207                        nesqp->private_data_len;
3208                /* copy entire MPA frame to our cm_node's frame */
3209                memcpy(cm_node->loopbackpartner->mpa_frame_buf,
3210                       conn_param->private_data, conn_param->private_data_len);
3211                create_event(cm_node->loopbackpartner, NES_CM_EVENT_CONNECTED);
3212        }
3213        if (ret)
3214                printk(KERN_ERR "%s[%u] OFA CM event_handler returned, "
3215                       "ret=%d\n", __func__, __LINE__, ret);
3216
3217        return 0;
3218}
3219
3220
3221/**
3222 * nes_reject
3223 */
3224int nes_reject(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len)
3225{
3226        struct nes_cm_node *cm_node;
3227        struct nes_cm_node *loopback;
3228        struct nes_cm_core *cm_core;
3229        u8 *start_buff;
3230
3231        atomic_inc(&cm_rejects);
3232        cm_node = (struct nes_cm_node *)cm_id->provider_data;
3233        loopback = cm_node->loopbackpartner;
3234        cm_core = cm_node->cm_core;
3235        cm_node->cm_id = cm_id;
3236
3237        if (pdata_len + sizeof(struct ietf_mpa_v2) > MAX_CM_BUFFER)
3238                return -EINVAL;
3239
3240        if (loopback) {
3241                memcpy(&loopback->mpa_frame.priv_data, pdata, pdata_len);
3242                loopback->mpa_frame.priv_data_len = pdata_len;
3243                loopback->mpa_frame_size = pdata_len;
3244        } else {
3245                start_buff = &cm_node->mpa_frame_buf[0] + sizeof(struct ietf_mpa_v2);
3246                cm_node->mpa_frame_size = pdata_len;
3247                memcpy(start_buff, pdata, pdata_len);
3248        }
3249        return cm_core->api->reject(cm_core, cm_node);
3250}
3251
3252
3253/**
3254 * nes_connect
3255 * setup and launch cm connect node
3256 */
3257int nes_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
3258{
3259        struct ib_qp *ibqp;
3260        struct nes_qp *nesqp;
3261        struct nes_vnic *nesvnic;
3262        struct nes_device *nesdev;
3263        struct nes_cm_node *cm_node;
3264        struct nes_cm_info cm_info;
3265        int apbvt_set = 0;
3266
3267        ibqp = nes_get_qp(cm_id->device, conn_param->qpn);
3268        if (!ibqp)
3269                return -EINVAL;
3270        nesqp = to_nesqp(ibqp);
3271        if (!nesqp)
3272                return -EINVAL;
3273        nesvnic = to_nesvnic(nesqp->ibqp.device);
3274        if (!nesvnic)
3275                return -EINVAL;
3276        nesdev = nesvnic->nesdev;
3277        if (!nesdev)
3278                return -EINVAL;
3279
3280        if (!(cm_id->local_addr.sin_port) || !(cm_id->remote_addr.sin_port))
3281                return -EINVAL;
3282
3283        nes_debug(NES_DBG_CM, "QP%u, current IP = 0x%08X, Destination IP = "
3284                  "0x%08X:0x%04X, local = 0x%08X:0x%04X.\n", nesqp->hwqp.qp_id,
3285                  ntohl(nesvnic->local_ipaddr),
3286                  ntohl(cm_id->remote_addr.sin_addr.s_addr),
3287                  ntohs(cm_id->remote_addr.sin_port),
3288                  ntohl(cm_id->local_addr.sin_addr.s_addr),
3289                  ntohs(cm_id->local_addr.sin_port));
3290
3291        atomic_inc(&cm_connects);
3292        nesqp->active_conn = 1;
3293
3294        /* cache the cm_id in the qp */
3295        nesqp->cm_id = cm_id;
3296
3297        cm_id->provider_data = nesqp;
3298
3299        nesqp->private_data_len = conn_param->private_data_len;
3300        nesqp->nesqp_context->ird_ord_sizes |= cpu_to_le32((u32)conn_param->ord);
3301        /* space for rdma0 read msg */
3302        if (conn_param->ord == 0)
3303                nesqp->nesqp_context->ird_ord_sizes |= cpu_to_le32(1);
3304
3305        nes_debug(NES_DBG_CM, "requested ord = 0x%08X.\n", (u32)conn_param->ord);
3306        nes_debug(NES_DBG_CM, "mpa private data len =%u\n",
3307                  conn_param->private_data_len);
3308
3309        if (cm_id->local_addr.sin_addr.s_addr !=
3310            cm_id->remote_addr.sin_addr.s_addr) {
3311                nes_manage_apbvt(nesvnic, ntohs(cm_id->local_addr.sin_port),
3312                                 PCI_FUNC(nesdev->pcidev->devfn), NES_MANAGE_APBVT_ADD);
3313                apbvt_set = 1;
3314        }
3315
3316        /* set up the connection params for the node */
3317        cm_info.loc_addr = htonl(cm_id->local_addr.sin_addr.s_addr);
3318        cm_info.loc_port = htons(cm_id->local_addr.sin_port);
3319        cm_info.rem_addr = htonl(cm_id->remote_addr.sin_addr.s_addr);
3320        cm_info.rem_port = htons(cm_id->remote_addr.sin_port);
3321        cm_info.cm_id = cm_id;
3322        cm_info.conn_type = NES_CM_IWARP_CONN_TYPE;
3323
3324        cm_id->add_ref(cm_id);
3325
3326        /* create a connect CM node connection */
3327        cm_node = g_cm_core->api->connect(g_cm_core, nesvnic,
3328                                          conn_param->private_data_len, (void *)conn_param->private_data,
3329                                          &cm_info);
3330        if (!cm_node) {
3331                if (apbvt_set)
3332                        nes_manage_apbvt(nesvnic, ntohs(cm_id->local_addr.sin_port),
3333                                         PCI_FUNC(nesdev->pcidev->devfn),
3334                                         NES_MANAGE_APBVT_DEL);
3335
3336                cm_id->rem_ref(cm_id);
3337                return -ENOMEM;
3338        }
3339
3340        cm_node->apbvt_set = apbvt_set;
3341        nesqp->cm_node = cm_node;
3342        cm_node->nesqp = nesqp;
3343        nes_add_ref(&nesqp->ibqp);
3344
3345        return 0;
3346}
3347
3348
3349/**
3350 * nes_create_listen
3351 */
3352int nes_create_listen(struct iw_cm_id *cm_id, int backlog)
3353{
3354        struct nes_vnic *nesvnic;
3355        struct nes_cm_listener *cm_node;
3356        struct nes_cm_info cm_info;
3357        int err;
3358
3359        nes_debug(NES_DBG_CM, "cm_id = %p, local port = 0x%04X.\n",
3360                        cm_id, ntohs(cm_id->local_addr.sin_port));
3361
3362        nesvnic = to_nesvnic(cm_id->device);
3363        if (!nesvnic)
3364                return -EINVAL;
3365
3366        nes_debug(NES_DBG_CM, "nesvnic=%p, netdev=%p, %s\n",
3367                        nesvnic, nesvnic->netdev, nesvnic->netdev->name);
3368
3369        nes_debug(NES_DBG_CM, "nesvnic->local_ipaddr=0x%08x, sin_addr.s_addr=0x%08x\n",
3370                        nesvnic->local_ipaddr, cm_id->local_addr.sin_addr.s_addr);
3371
3372        /* setup listen params in our api call struct */
3373        cm_info.loc_addr = nesvnic->local_ipaddr;
3374        cm_info.loc_port = cm_id->local_addr.sin_port;
3375        cm_info.backlog = backlog;
3376        cm_info.cm_id = cm_id;
3377
3378        cm_info.conn_type = NES_CM_IWARP_CONN_TYPE;
3379
3380
3381        cm_node = g_cm_core->api->listen(g_cm_core, nesvnic, &cm_info);
3382        if (!cm_node) {
3383                printk(KERN_ERR "%s[%u] Error returned from listen API call\n",
3384                       __func__, __LINE__);
3385                return -ENOMEM;
3386        }
3387
3388        cm_id->provider_data = cm_node;
3389
3390        if (!cm_node->reused_node) {
3391                err = nes_manage_apbvt(nesvnic,
3392                                       ntohs(cm_id->local_addr.sin_port),
3393                                       PCI_FUNC(nesvnic->nesdev->pcidev->devfn),
3394                                       NES_MANAGE_APBVT_ADD);
3395                if (err) {
3396                        printk(KERN_ERR "nes_manage_apbvt call returned %d.\n",
3397                               err);
3398                        g_cm_core->api->stop_listener(g_cm_core, (void *)cm_node);
3399                        return err;
3400                }
3401                atomic_inc(&cm_listens_created);
3402        }
3403
3404        cm_id->add_ref(cm_id);
3405        cm_id->provider_data = (void *)cm_node;
3406
3407
3408        return 0;
3409}
3410
3411
3412/**
3413 * nes_destroy_listen
3414 */
3415int nes_destroy_listen(struct iw_cm_id *cm_id)
3416{
3417        if (cm_id->provider_data)
3418                g_cm_core->api->stop_listener(g_cm_core, cm_id->provider_data);
3419        else
3420                nes_debug(NES_DBG_CM, "cm_id->provider_data was NULL\n");
3421
3422        cm_id->rem_ref(cm_id);
3423
3424        return 0;
3425}
3426
3427
3428/**
3429 * nes_cm_recv
3430 */
3431int nes_cm_recv(struct sk_buff *skb, struct net_device *netdevice)
3432{
3433        int rc = 0;
3434
3435        cm_packets_received++;
3436        if ((g_cm_core) && (g_cm_core->api))
3437                rc = g_cm_core->api->recv_pkt(g_cm_core, netdev_priv(netdevice), skb);
3438        else
3439                nes_debug(NES_DBG_CM, "Unable to process packet for CM,"
3440                          " cm is not setup properly.\n");
3441
3442        return rc;
3443}
3444
3445
3446/**
3447 * nes_cm_start
3448 * Start and init a cm core module
3449 */
3450int nes_cm_start(void)
3451{
3452        nes_debug(NES_DBG_CM, "\n");
3453        /* create the primary CM core, pass this handle to subsequent core inits */
3454        g_cm_core = nes_cm_alloc_core();
3455        if (g_cm_core)
3456                return 0;
3457        else
3458                return -ENOMEM;
3459}
3460
3461
3462/**
3463 * nes_cm_stop
3464 * stop and dealloc all cm core instances
3465 */
3466int nes_cm_stop(void)
3467{
3468        g_cm_core->api->destroy_cm_core(g_cm_core);
3469        return 0;
3470}
3471
3472
3473/**
3474 * cm_event_connected
3475 * handle a connected event, setup QPs and HW
3476 */
3477static void cm_event_connected(struct nes_cm_event *event)
3478{
3479        struct nes_qp *nesqp;
3480        struct nes_vnic *nesvnic;
3481        struct nes_device *nesdev;
3482        struct nes_cm_node *cm_node;
3483        struct nes_adapter *nesadapter;
3484        struct ib_qp_attr attr;
3485        struct iw_cm_id *cm_id;
3486        struct iw_cm_event cm_event;
3487        struct nes_v4_quad nes_quad;
3488        u32 crc_value;
3489        int ret;
3490
3491        /* get all our handles */
3492        cm_node = event->cm_node;
3493        cm_id = cm_node->cm_id;
3494        nes_debug(NES_DBG_CM, "cm_event_connected - %p - cm_id = %p\n", cm_node, cm_id);
3495        nesqp = (struct nes_qp *)cm_id->provider_data;
3496        nesvnic = to_nesvnic(nesqp->ibqp.device);
3497        nesdev = nesvnic->nesdev;
3498        nesadapter = nesdev->nesadapter;
3499
3500        if (nesqp->destroyed)
3501                return;
3502        atomic_inc(&cm_connecteds);
3503        nes_debug(NES_DBG_CM, "QP%u attempting to connect to  0x%08X:0x%04X on"
3504                  " local port 0x%04X. jiffies = %lu.\n",
3505                  nesqp->hwqp.qp_id,
3506                  ntohl(cm_id->remote_addr.sin_addr.s_addr),
3507                  ntohs(cm_id->remote_addr.sin_port),
3508                  ntohs(cm_id->local_addr.sin_port),
3509                  jiffies);
3510
3511        nes_cm_init_tsa_conn(nesqp, cm_node);
3512
3513        /* set the QP tsa context */
3514        nesqp->nesqp_context->tcpPorts[0] =
3515                cpu_to_le16(ntohs(cm_id->local_addr.sin_port));
3516        nesqp->nesqp_context->tcpPorts[1] =
3517                cpu_to_le16(ntohs(cm_id->remote_addr.sin_port));
3518        nesqp->nesqp_context->ip0 =
3519                        cpu_to_le32(ntohl(cm_id->remote_addr.sin_addr.s_addr));
3520
3521        nesqp->nesqp_context->misc2 |= cpu_to_le32(
3522                        (u32)PCI_FUNC(nesdev->pcidev->devfn) <<
3523                        NES_QPCONTEXT_MISC2_SRC_IP_SHIFT);
3524        nesqp->nesqp_context->arp_index_vlan |= cpu_to_le32(
3525                        nes_arp_table(nesdev,
3526                        le32_to_cpu(nesqp->nesqp_context->ip0),
3527                        NULL, NES_ARP_RESOLVE) << 16);
3528        nesqp->nesqp_context->ts_val_delta = cpu_to_le32(
3529                        jiffies - nes_read_indexed(nesdev, NES_IDX_TCP_NOW));
3530        nesqp->nesqp_context->ird_index = cpu_to_le32(nesqp->hwqp.qp_id);
3531        nesqp->nesqp_context->ird_ord_sizes |=
3532                        cpu_to_le32((u32)1 <<
3533                        NES_QPCONTEXT_ORDIRD_IWARP_MODE_SHIFT);
3534
3535        /* Adjust tail for not having a LSMM */
3536        /*nesqp->hwqp.sq_tail = 1;*/
3537
3538        build_rdma0_msg(cm_node, &nesqp);
3539
3540        nes_write32(nesdev->regs + NES_WQE_ALLOC,
3541                    (1 << 24) | 0x00800000 | nesqp->hwqp.qp_id);
3542
3543        memset(&nes_quad, 0, sizeof(nes_quad));
3544
3545        nes_quad.DstIpAdrIndex =
3546                cpu_to_le32((u32)PCI_FUNC(nesdev->pcidev->devfn) << 24);
3547        nes_quad.SrcIpadr = cm_id->remote_addr.sin_addr.s_addr;
3548        nes_quad.TcpPorts[0] = cm_id->remote_addr.sin_port;
3549        nes_quad.TcpPorts[1] = cm_id->local_addr.sin_port;
3550
3551        /* Produce hash key */
3552        crc_value = get_crc_value(&nes_quad);
3553        nesqp->hte_index = cpu_to_be32(crc_value ^ 0xffffffff);
3554        nes_debug(NES_DBG_CM, "HTE Index = 0x%08X, After CRC = 0x%08X\n",
3555                  nesqp->hte_index, nesqp->hte_index & nesadapter->hte_index_mask);
3556
3557        nesqp->hte_index &= nesadapter->hte_index_mask;
3558        nesqp->nesqp_context->hte_index = cpu_to_le32(nesqp->hte_index);
3559
3560        nesqp->ietf_frame = &cm_node->mpa_frame;
3561        nesqp->private_data_len = (u8)cm_node->mpa_frame_size;
3562        cm_node->cm_core->api->accelerated(cm_node->cm_core, cm_node);
3563
3564        /* notify OF layer we successfully created the requested connection */
3565        cm_event.event = IW_CM_EVENT_CONNECT_REPLY;
3566        cm_event.status = 0;
3567        cm_event.provider_data = cm_id->provider_data;
3568        cm_event.local_addr.sin_family = AF_INET;
3569        cm_event.local_addr.sin_port = cm_id->local_addr.sin_port;
3570        cm_event.remote_addr = cm_id->remote_addr;
3571
3572        cm_event.private_data = (void *)event->cm_node->mpa_frame_buf;
3573        cm_event.private_data_len = (u8)event->cm_node->mpa_frame_size;
3574        cm_event.ird = cm_node->ird_size;
3575        cm_event.ord = cm_node->ord_size;
3576
3577        cm_event.local_addr.sin_addr.s_addr = event->cm_info.rem_addr;
3578        ret = cm_id->event_handler(cm_id, &cm_event);
3579        nes_debug(NES_DBG_CM, "OFA CM event_handler returned, ret=%d\n", ret);
3580
3581        if (ret)
3582                printk(KERN_ERR "%s[%u] OFA CM event_handler returned, "
3583                       "ret=%d\n", __func__, __LINE__, ret);
3584        attr.qp_state = IB_QPS_RTS;
3585        nes_modify_qp(&nesqp->ibqp, &attr, IB_QP_STATE, NULL);
3586
3587        nes_debug(NES_DBG_CM, "Exiting connect thread for QP%u. jiffies = "
3588                  "%lu\n", nesqp->hwqp.qp_id, jiffies);
3589
3590        return;
3591}
3592
3593
3594/**
3595 * cm_event_connect_error
3596 */
3597static void cm_event_connect_error(struct nes_cm_event *event)
3598{
3599        struct nes_qp *nesqp;
3600        struct iw_cm_id *cm_id;
3601        struct iw_cm_event cm_event;
3602        /* struct nes_cm_info cm_info; */
3603        int ret;
3604
3605        if (!event->cm_node)
3606                return;
3607
3608        cm_id = event->cm_node->cm_id;
3609        if (!cm_id)
3610                return;
3611
3612        nes_debug(NES_DBG_CM, "cm_node=%p, cm_id=%p\n", event->cm_node, cm_id);
3613        nesqp = cm_id->provider_data;
3614
3615        if (!nesqp)
3616                return;
3617
3618        /* notify OF layer about this connection error event */
3619        /* cm_id->rem_ref(cm_id); */
3620        nesqp->cm_id = NULL;
3621        cm_id->provider_data = NULL;
3622        cm_event.event = IW_CM_EVENT_CONNECT_REPLY;
3623        cm_event.status = -ECONNRESET;
3624        cm_event.provider_data = cm_id->provider_data;
3625        cm_event.local_addr = cm_id->local_addr;
3626        cm_event.remote_addr = cm_id->remote_addr;
3627        cm_event.private_data = NULL;
3628        cm_event.private_data_len = 0;
3629
3630        nes_debug(NES_DBG_CM, "call CM_EVENT REJECTED, local_addr=%08x, "
3631                  "remove_addr=%08x\n", cm_event.local_addr.sin_addr.s_addr,
3632                  cm_event.remote_addr.sin_addr.s_addr);
3633
3634        ret = cm_id->event_handler(cm_id, &cm_event);
3635        nes_debug(NES_DBG_CM, "OFA CM event_handler returned, ret=%d\n", ret);
3636        if (ret)
3637                printk(KERN_ERR "%s[%u] OFA CM event_handler returned, "
3638                       "ret=%d\n", __func__, __LINE__, ret);
3639        cm_id->rem_ref(cm_id);
3640
3641        rem_ref_cm_node(event->cm_node->cm_core, event->cm_node);
3642        return;
3643}
3644
3645
3646/**
3647 * cm_event_reset
3648 */
3649static void cm_event_reset(struct nes_cm_event *event)
3650{
3651        struct nes_qp *nesqp;
3652        struct iw_cm_id *cm_id;
3653        struct iw_cm_event cm_event;
3654        /* struct nes_cm_info cm_info; */
3655        int ret;
3656
3657        if (!event->cm_node)
3658                return;
3659
3660        if (!event->cm_node->cm_id)
3661                return;
3662
3663        cm_id = event->cm_node->cm_id;
3664
3665        nes_debug(NES_DBG_CM, "%p - cm_id = %p\n", event->cm_node, cm_id);
3666        nesqp = cm_id->provider_data;
3667        if (!nesqp)
3668                return;
3669
3670        nesqp->cm_id = NULL;
3671        /* cm_id->provider_data = NULL; */
3672        cm_event.event = IW_CM_EVENT_DISCONNECT;
3673        cm_event.status = -ECONNRESET;
3674        cm_event.provider_data = cm_id->provider_data;
3675        cm_event.local_addr = cm_id->local_addr;
3676        cm_event.remote_addr = cm_id->remote_addr;
3677        cm_event.private_data = NULL;
3678        cm_event.private_data_len = 0;
3679
3680        cm_id->add_ref(cm_id);
3681        ret = cm_id->event_handler(cm_id, &cm_event);
3682        atomic_inc(&cm_closes);
3683        cm_event.event = IW_CM_EVENT_CLOSE;
3684        cm_event.status = 0;
3685        cm_event.provider_data = cm_id->provider_data;
3686        cm_event.local_addr = cm_id->local_addr;
3687        cm_event.remote_addr = cm_id->remote_addr;
3688        cm_event.private_data = NULL;
3689        cm_event.private_data_len = 0;
3690        nes_debug(NES_DBG_CM, "NODE %p Generating CLOSE\n", event->cm_node);
3691        ret = cm_id->event_handler(cm_id, &cm_event);
3692
3693        nes_debug(NES_DBG_CM, "OFA CM event_handler returned, ret=%d\n", ret);
3694
3695
3696        /* notify OF layer about this connection error event */
3697        cm_id->rem_ref(cm_id);
3698
3699        return;
3700}
3701
3702
3703/**
3704 * cm_event_mpa_req
3705 */
3706static void cm_event_mpa_req(struct nes_cm_event *event)
3707{
3708        struct iw_cm_id *cm_id;
3709        struct iw_cm_event cm_event;
3710        int ret;
3711        struct nes_cm_node *cm_node;
3712
3713        cm_node = event->cm_node;
3714        if (!cm_node)
3715                return;
3716        cm_id = cm_node->cm_id;
3717
3718        atomic_inc(&cm_connect_reqs);
3719        nes_debug(NES_DBG_CM, "cm_node = %p - cm_id = %p, jiffies = %lu\n",
3720                  cm_node, cm_id, jiffies);
3721
3722        cm_event.event = IW_CM_EVENT_CONNECT_REQUEST;
3723        cm_event.status = 0;
3724        cm_event.provider_data = (void *)cm_node;
3725
3726        cm_event.local_addr.sin_family = AF_INET;
3727        cm_event.local_addr.sin_port = htons(event->cm_info.loc_port);
3728        cm_event.local_addr.sin_addr.s_addr = htonl(event->cm_info.loc_addr);
3729
3730        cm_event.remote_addr.sin_family = AF_INET;
3731        cm_event.remote_addr.sin_port = htons(event->cm_info.rem_port);
3732        cm_event.remote_addr.sin_addr.s_addr = htonl(event->cm_info.rem_addr);
3733        cm_event.private_data = cm_node->mpa_frame_buf;
3734        cm_event.private_data_len = (u8)cm_node->mpa_frame_size;
3735        cm_event.ird = cm_node->ird_size;
3736        cm_event.ord = cm_node->ord_size;
3737
3738        ret = cm_id->event_handler(cm_id, &cm_event);
3739        if (ret)
3740                printk(KERN_ERR "%s[%u] OFA CM event_handler returned, ret=%d\n",
3741                       __func__, __LINE__, ret);
3742        return;
3743}
3744
3745
3746static void cm_event_mpa_reject(struct nes_cm_event *event)
3747{
3748        struct iw_cm_id *cm_id;
3749        struct iw_cm_event cm_event;
3750        struct nes_cm_node *cm_node;
3751        int ret;
3752
3753        cm_node = event->cm_node;
3754        if (!cm_node)
3755                return;
3756        cm_id = cm_node->cm_id;
3757
3758        atomic_inc(&cm_connect_reqs);
3759        nes_debug(NES_DBG_CM, "cm_node = %p - cm_id = %p, jiffies = %lu\n",
3760                  cm_node, cm_id, jiffies);
3761
3762        cm_event.event = IW_CM_EVENT_CONNECT_REPLY;
3763        cm_event.status = -ECONNREFUSED;
3764        cm_event.provider_data = cm_id->provider_data;
3765
3766        cm_event.local_addr.sin_family = AF_INET;
3767        cm_event.local_addr.sin_port = htons(event->cm_info.loc_port);
3768        cm_event.local_addr.sin_addr.s_addr = htonl(event->cm_info.loc_addr);
3769
3770        cm_event.remote_addr.sin_family = AF_INET;
3771        cm_event.remote_addr.sin_port = htons(event->cm_info.rem_port);
3772        cm_event.remote_addr.sin_addr.s_addr = htonl(event->cm_info.rem_addr);
3773
3774        cm_event.private_data = cm_node->mpa_frame_buf;
3775        cm_event.private_data_len = (u8)cm_node->mpa_frame_size;
3776
3777        nes_debug(NES_DBG_CM, "call CM_EVENT_MPA_REJECTED, local_addr=%08x, "
3778                  "remove_addr=%08x\n",
3779                  cm_event.local_addr.sin_addr.s_addr,
3780                  cm_event.remote_addr.sin_addr.s_addr);
3781
3782        ret = cm_id->event_handler(cm_id, &cm_event);
3783        if (ret)
3784                printk(KERN_ERR "%s[%u] OFA CM event_handler returned, ret=%d\n",
3785                       __func__, __LINE__, ret);
3786
3787        return;
3788}
3789
3790
3791static void nes_cm_event_handler(struct work_struct *);
3792
3793/**
3794 * nes_cm_post_event
3795 * post an event to the cm event handler
3796 */
3797static int nes_cm_post_event(struct nes_cm_event *event)
3798{
3799        atomic_inc(&event->cm_node->cm_core->events_posted);
3800        add_ref_cm_node(event->cm_node);
3801        event->cm_info.cm_id->add_ref(event->cm_info.cm_id);
3802        INIT_WORK(&event->event_work, nes_cm_event_handler);
3803        nes_debug(NES_DBG_CM, "cm_node=%p queue_work, event=%p\n",
3804                  event->cm_node, event);
3805
3806        queue_work(event->cm_node->cm_core->event_wq, &event->event_work);
3807
3808        nes_debug(NES_DBG_CM, "Exit\n");
3809        return 0;
3810}
3811
3812
3813/**
3814 * nes_cm_event_handler
3815 * worker function to handle cm events
3816 * will free instance of nes_cm_event
3817 */
3818static void nes_cm_event_handler(struct work_struct *work)
3819{
3820        struct nes_cm_event *event = container_of(work, struct nes_cm_event,
3821                                                  event_work);
3822        struct nes_cm_core *cm_core;
3823
3824        if ((!event) || (!event->cm_node) || (!event->cm_node->cm_core))
3825                return;
3826
3827        cm_core = event->cm_node->cm_core;
3828        nes_debug(NES_DBG_CM, "event=%p, event->type=%u, events posted=%u\n",
3829                  event, event->type, atomic_read(&cm_core->events_posted));
3830
3831        switch (event->type) {
3832        case NES_CM_EVENT_MPA_REQ:
3833                cm_event_mpa_req(event);
3834                nes_debug(NES_DBG_CM, "cm_node=%p CM Event: MPA REQUEST\n",
3835                          event->cm_node);
3836                break;
3837        case NES_CM_EVENT_RESET:
3838                nes_debug(NES_DBG_CM, "cm_node = %p CM Event: RESET\n",
3839                          event->cm_node);
3840                cm_event_reset(event);
3841                break;
3842        case NES_CM_EVENT_CONNECTED:
3843                if ((!event->cm_node->cm_id) ||
3844                    (event->cm_node->state != NES_CM_STATE_TSA))
3845                        break;
3846                cm_event_connected(event);
3847                nes_debug(NES_DBG_CM, "CM Event: CONNECTED\n");
3848                break;
3849        case NES_CM_EVENT_MPA_REJECT:
3850                if ((!event->cm_node->cm_id) ||
3851                    (event->cm_node->state == NES_CM_STATE_TSA))
3852                        break;
3853                cm_event_mpa_reject(event);
3854                nes_debug(NES_DBG_CM, "CM Event: REJECT\n");
3855                break;
3856
3857        case NES_CM_EVENT_ABORTED:
3858                if ((!event->cm_node->cm_id) ||
3859                    (event->cm_node->state == NES_CM_STATE_TSA))
3860                        break;
3861                cm_event_connect_error(event);
3862                nes_debug(NES_DBG_CM, "CM Event: ABORTED\n");
3863                break;
3864        case NES_CM_EVENT_DROPPED_PKT:
3865                nes_debug(NES_DBG_CM, "CM Event: DROPPED PKT\n");
3866                break;
3867        default:
3868                nes_debug(NES_DBG_CM, "CM Event: UNKNOWN EVENT TYPE\n");
3869                break;
3870        }
3871
3872        atomic_dec(&cm_core->events_posted);
3873        event->cm_info.cm_id->rem_ref(event->cm_info.cm_id);
3874        rem_ref_cm_node(cm_core, event->cm_node);
3875        kfree(event);
3876
3877        return;
3878}
3879