Main Page | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

vipl_priv_conn_recv.c

Go to the documentation of this file.
00001 /********************************************************
00002  * Myricom VI-GM  networking software and documentation *
00003  * Copyright (c) 2001 by Myricom, Inc.                  *
00004  * All rights reserved.                                 *
00005  * See the file `COPYING' for copyright notice.         *
00006  ********************************************************/
00007 
00015 #include <string.h>
00016 
00017 #include "vipl_priv.h"
00018 
00031 static void
00032 vip_send_conn_request (VIP_CONN * vip_conn_ptr, VIP_GM * vip_gm_ptr)
00033 {
00034   VIP_VI *vip_vi_ptr;
00035   VIP_SEND_REQ *vip_send_req_ptr;
00036   VIP_PACKET_CONN_REQ *pkt_ptr;
00037   VIP_DEBUG_LABEL (("vip_send_conn_request"));
00038 
00039   vip_vi_ptr = vip_conn_ptr->vip_vi_ptr;
00040   if (VIP_INVALID_VI_HANDLE (vip_vi_ptr))
00041     {
00042       VIP_DEBUG (("Invalid VI handle"));
00043       return;
00044     }
00045 
00046   if ((vip_conn_ptr->type == VIP_CONN_TYPE_PEER) 
00047       && (vip_conn_ptr->waiting_list == VIP_FALSE))
00048     {
00049       return;
00050     }
00051 
00052   vip_send_req_ptr = vip_allocate_packet (vip_gm_ptr,
00053                                           sizeof (VIP_PACKET_CONN_REQ));
00054   VIP_ASSERT (vip_send_req_ptr != NULL);
00055 
00056   /* fill the packet and send it */
00057   pkt_ptr = (VIP_PACKET_CONN_REQ *) (vip_send_req_ptr->ptr);
00058   if (vip_conn_ptr->type == VIP_CONN_TYPE_PEER)
00059     {
00060       pkt_ptr->type = VIP_HTON_UCHAR (VIP_CONN_PEER_REQ_PKT);
00061     }
00062   else
00063     {
00064       pkt_ptr->type = VIP_HTON_UCHAR (VIP_CONN_REQ_PKT);
00065     }
00066   pkt_ptr->clt_seq_num = VIP_HTON_UINT16 (vip_conn_ptr->handle.seq_num);
00067   pkt_ptr->clt_conn_ptr = VIP_HTON_UINT64 (vip_addr2addrbits (vip_conn_ptr));
00068   pkt_ptr->srv_net_magic =
00069     vip_conn_ptr->net_srv_magic[vip_conn_ptr->remote_port_id];
00070 
00071   pkt_ptr->qos = VIP_HTON_UINT64 (vip_addr2addrbits (vip_vi_ptr->qos));
00072   pkt_ptr->mtu = VIP_HTON_UINT32 (vip_vi_ptr->mtu);
00073   pkt_ptr->reliability = VIP_HTON_UINT16 (vip_vi_ptr->reliability);
00074   pkt_ptr->rdma_write = VIP_HTON_UCHAR (vip_vi_ptr->rdma_write);
00075 
00076   pkt_ptr->clt_disc_len = VIP_HTON_UINT16 (vip_conn_ptr->locale_disc_len);
00077   memcpy (pkt_ptr->clt_net_addr, vip_conn_ptr->locale_net_addr,
00078           VI_GM_MAC_ADDRESS_LEN + vip_conn_ptr->locale_disc_len);
00079   pkt_ptr->srv_disc_len = VIP_HTON_UINT16 (vip_conn_ptr->remote_disc_len);
00080   memcpy (pkt_ptr->srv_net_addr, vip_conn_ptr->remote_net_addr,
00081           VI_GM_MAC_ADDRESS_LEN + vip_conn_ptr->remote_disc_len);
00082 
00083   vip_send_req_ptr->type |= VIP_SEND_REQ_RELIABLE;
00084   vip_send_req_ptr->dest_port_id = vip_conn_ptr->remote_port_id;
00085   vip_send_req_ptr->dest_gm_id = vip_conn_ptr->remote_gm_id;
00086   vip_send_req_ptr->vip_nic_ptr = vip_conn_ptr->handle.vip_nic_ptr;
00087   vip_send_req_ptr->vip_vi_ptr = vip_vi_ptr;
00088   vip_send_data (vip_send_req_ptr);
00089 }
00090 
00105 void
00106 vip_handle_conn_list (VIP_PACKET_CONN_LIST * ptr, VIP_GM * vip_gm_ptr)
00107 {
00108   VIP_CONN *vip_conn_ptr;
00109   VIP_UCHAR srv_port_id;
00110   VIP_NET_UINT32 srv_net_magic;
00111   VIP_DEBUG_LABEL (("vip_handle_conn_list"));
00112 
00113   /* check conn handle ptr */
00114   vip_conn_ptr = 
00115     (VIP_CONN *) vip_addrbits2addr (VIP_NTOH_UINT64 (ptr->clt_conn_ptr));
00116   if (VIP_INVALID_CONN_HANDLE (vip_conn_ptr))
00117     {
00118       VIP_DEBUG (("Invalid CONN handle ptr in CONN_LIST message"));
00119       return;
00120     }
00121   VIP_MUTEX_LOCK (&(vip_conn_ptr->handle.vip_nic_ptr->lock));
00122 
00123   /* check conn handle sequence number */
00124   if (VIP_NTOH_UINT16 (ptr->clt_seq_num) != vip_conn_ptr->handle.seq_num)
00125     {
00126       VIP_DEBUG (("Invalid CONN seq number in CONN_LIST message"));
00127       VIP_MUTEX_UNLOCK (&(vip_conn_ptr->handle.vip_nic_ptr->lock));
00128       return;
00129     }
00130   VIP_ASSERT ((vip_conn_ptr->type == VIP_CONN_TYPE_CLIENT)
00131               || (vip_conn_ptr->type == VIP_CONN_TYPE_PEER));
00132 
00133   memcpy (vip_conn_ptr->net_srv_magic, ptr->net_srv_magic,
00134           VI_GM_MAX_PORTS * sizeof (VIP_NET_UINT32));
00135 
00136   /* look for the first possible endpoint */
00137   srv_port_id = vip_conn_ptr->remote_port_id;
00138   srv_net_magic = VIP_HTON_UINT32 (0);
00139   while (srv_port_id < VI_GM_MAX_PORTS)
00140     {
00141       if (VIP_NTOH_UINT32 (ptr->net_srv_magic[srv_port_id]) != 0)
00142         {
00143           srv_net_magic = ptr->net_srv_magic[srv_port_id];
00144           break;
00145         }
00146       srv_port_id++;
00147     }
00148 
00149   if (VIP_NTOH_UINT32 (srv_net_magic) == 0)
00150     {
00151       if (vip_conn_ptr->type == VIP_CONN_TYPE_CLIENT)
00152         {
00153           /* no luck, return NO_MATCH */
00154           vip_conn_ptr->status = VIP_NO_MATCH;
00155           VIP_EVENT_SIGNAL (&(vip_conn_ptr->event));
00156         }
00157       VIP_MUTEX_UNLOCK (&(vip_conn_ptr->handle.vip_nic_ptr->lock));
00158       VIP_DEBUG (("No match"));
00159       return;
00160     }
00161 
00162   /* we got a winner, send a connection request */
00163   vip_conn_ptr->remote_port_id = srv_port_id;
00164   vip_send_conn_request (vip_conn_ptr, vip_gm_ptr);
00165 
00166   VIP_MUTEX_UNLOCK (&(vip_conn_ptr->handle.vip_nic_ptr->lock));
00167   VIP_DEBUG (("Connection request sent to first endpoint"));
00168 }
00169 
00187 void
00188 vip_handle_conn_req (VIP_PACKET_CONN_REQ * ptr,
00189                      gm_recv_event_t * gm_event, 
00190                      VIP_GM * vip_gm_ptr)
00191 {
00192   VIP_CONN *vip_conn_ptr;
00193   VIP_CONN *vip_tmp_conn_ptr;
00194   VIP_RETURN peer_status;
00195   VIP_SEND_REQ *vip_send_req_ptr;
00196   VIP_PACKET *pkt_ptr;
00197   VIP_DEBUG_LABEL (("vip_handle_conn_req"));
00198 
00199   /* check magic number */
00200   if (VIP_NTOH_UINT32 (ptr->srv_net_magic) != vip_gm_ptr->magic)
00201     {
00202       goto send_nomatch;
00203     }
00204 
00205   /* search for matching connection */
00206   vip_conn_ptr = vip_gm_ptr->head_waiting_conn_ptr;
00207   while (vip_conn_ptr != NULL)
00208     {
00209       VIP_MUTEX_LOCK (&(vip_conn_ptr->handle.vip_nic_ptr->lock));
00210       VIP_ASSERT (vip_conn_ptr->waiting_list == VIP_TRUE);
00211 
00212       /* process a client/server connection request or a peer request */
00213       if (VIP_NTOH_UCHAR (ptr->type) == VIP_CONN_REQ_PKT)
00214         {
00215           /* client/server model */
00216           if ((vip_conn_ptr->type == VIP_CONN_TYPE_SERVER)
00217               && (vip_conn_ptr->status == VIP_NOT_DONE)
00218               && (VIP_NTOH_UINT16 (ptr->srv_disc_len)
00219                   == vip_conn_ptr->locale_disc_len)
00220               && (memcmp (ptr->srv_net_addr,
00221                           vip_conn_ptr->locale_net_addr,
00222                           VI_GM_MAC_ADDRESS_LEN
00223                           + vip_conn_ptr->locale_disc_len) == 0))
00224             {
00225               vip_conn_ptr->net_remote_seq_num = ptr->clt_seq_num;
00226               vip_conn_ptr->net_remote_conn_ptr = ptr->clt_conn_ptr;
00227               vip_conn_ptr->remote_vi_attribs.ReliabilityLevel =
00228                 VIP_NTOH_UINT16 (ptr->reliability);
00229               vip_conn_ptr->remote_vi_attribs.MaxTransferSize =
00230                 VIP_NTOH_UINT32 (ptr->mtu);
00231               vip_conn_ptr->remote_vi_attribs.QoS =
00232                 vip_addrbits2addr (VIP_NTOH_UINT64 (ptr->qos));
00233               vip_conn_ptr->remote_vi_attribs.EnableRdmaWrite =
00234                 VIP_NTOH_UCHAR (ptr->rdma_write);
00235               vip_conn_ptr->remote_vi_attribs.EnableRdmaRead = VIP_FALSE;
00236               vip_conn_ptr->remote_disc_len =
00237                 VIP_NTOH_UINT16 (ptr->clt_disc_len);
00238               memcpy (vip_conn_ptr->remote_net_addr, ptr->clt_net_addr,
00239                       VI_GM_MAC_ADDRESS_LEN + vip_conn_ptr->remote_disc_len);
00240               vip_conn_ptr->remote_gm_id =
00241                 gm_ntohs (gm_event->recv.sender_node_id);
00242               vip_conn_ptr->remote_port_id =
00243                 gm_ntohc (gm_event->recv.sender_port_id);
00244 
00245               /* remove the connection from the waiting list */
00246               vip_remove_conn_waiting_list (vip_gm_ptr, vip_conn_ptr);
00247 
00248               vip_conn_ptr->status = VIP_SUCCESS;
00249               VIP_EVENT_SIGNAL (&(vip_conn_ptr->event));
00250               VIP_MUTEX_UNLOCK (&(vip_conn_ptr->handle.vip_nic_ptr->lock));
00251               VIP_DEBUG (("Success (client/server model)"));
00252               return;
00253             }
00254         }
00255       else
00256         {
00257           /* handling connection peer request */
00258           VIP_ASSERT (VIP_NTOH_UCHAR (ptr->type) == VIP_CONN_PEER_REQ_PKT);
00259 
00260           if ((vip_conn_ptr->type == VIP_CONN_TYPE_PEER)
00261               && (vip_conn_ptr->status == VIP_NOT_DONE)
00262               && ((vip_conn_ptr->handle.vip_nic_ptr->vip_gm_ptr->gm_port_id
00263                    != gm_ntohc (gm_event->recv.sender_port_id))
00264                   || (vip_conn_ptr->handle.vip_nic_ptr->vip_gm_ptr->gm_id
00265                       != gm_ntohs (gm_event->recv.sender_node_id))
00266                   || (VIP_NTOH_UINT16 (ptr->clt_seq_num)
00267                       != vip_conn_ptr->handle.seq_num)
00268                   || (vip_conn_ptr != (VIP_CONN *)
00269                       vip_addrbits2addr (VIP_NTOH_UINT64 (ptr->clt_conn_ptr))))
00270               && (VIP_NTOH_UINT16 (ptr->srv_disc_len)
00271                   == vip_conn_ptr->locale_disc_len)
00272               && (memcmp (ptr->clt_net_addr, vip_conn_ptr->remote_net_addr,
00273                           VI_GM_MAC_ADDRESS_LEN) == 0)
00274               && (memcmp (ptr->srv_net_addr, vip_conn_ptr->locale_net_addr,
00275                           VI_GM_MAC_ADDRESS_LEN) == 0)
00276               && (memcmp (&(ptr->srv_net_addr[VI_GM_MAC_ADDRESS_LEN]),
00277                           &(vip_conn_ptr->remote_net_addr
00278                             [VI_GM_MAC_ADDRESS_LEN]),
00279                           vip_conn_ptr->locale_disc_len) == 0))
00280             {
00281               /* check the peer conn request matches vi attributes */
00282               if (vip_conn_ptr->remote_vi_attribs.ReliabilityLevel
00283                   != VIP_NTOH_UINT16 (ptr->reliability))
00284                 {
00285                   peer_status = VIP_INVALID_RELIABILITY_LEVEL;
00286                   goto peer_reject;
00287                 }
00288 
00289               if (vip_conn_ptr->remote_vi_attribs.MaxTransferSize
00290                   != VIP_NTOH_UINT32 (ptr->mtu))
00291                 {
00292                   peer_status = VIP_INVALID_MTU;
00293                   goto peer_reject;
00294                 }
00295 
00296               if (vip_conn_ptr->remote_vi_attribs.QoS
00297                   != vip_addrbits2addr (VIP_NTOH_UINT64 (ptr->qos)))
00298                 {
00299                   peer_status = VIP_INVALID_MTU;
00300                   goto peer_reject;
00301                 }
00302 
00303               vip_conn_ptr->remote_vi_attribs.EnableRdmaWrite =
00304                 VIP_NTOH_UCHAR (ptr->rdma_write);
00305               vip_conn_ptr->remote_gm_id =
00306                 gm_ntohs (gm_event->recv.sender_node_id);
00307               vip_conn_ptr->remote_port_id =
00308                 gm_ntohc (gm_event->recv.sender_port_id);
00309 
00310               gm_cancel_alarm (&(vip_conn_ptr->peer_timeout_alarm));
00311               vip_remove_conn_waiting_list (vip_gm_ptr, vip_conn_ptr);
00312 
00313               /* send a conn peer accept message */
00314               vip_send_req_ptr =
00315                 vip_allocate_packet (vip_gm_ptr,
00316                                      sizeof (VIP_PACKET_CONN_ACCEPT));
00317               VIP_ASSERT (vip_send_req_ptr != NULL);
00318 
00319               pkt_ptr = (VIP_PACKET *) (vip_send_req_ptr->ptr);
00320               pkt_ptr->vip_pkt_conn_accept.type =
00321                 VIP_HTON_UCHAR (VIP_CONN_PEER_ACCEPT_PKT);
00322               pkt_ptr->vip_pkt_conn_accept.rdma_write =
00323                 VIP_HTON_UCHAR (vip_conn_ptr->vip_vi_ptr->rdma_write);
00324               pkt_ptr->vip_pkt_conn_accept.clt_conn_ptr = ptr->clt_conn_ptr;
00325               pkt_ptr->vip_pkt_conn_accept.clt_seq_num = ptr->clt_seq_num;
00326               pkt_ptr->vip_pkt_conn_accept.srv_seq_num =
00327                 VIP_HTON_UINT16 (vip_conn_ptr->handle.seq_num);
00328               pkt_ptr->vip_pkt_conn_accept.srv_conn_ptr =
00329                 VIP_HTON_UINT64 (vip_addr2addrbits (vip_conn_ptr));
00330               pkt_ptr->vip_pkt_conn_accept.net_local_nic_index =
00331                 VIP_HTON_UINT16 
00332                 (vip_conn_ptr->vip_vi_ptr->handle.vip_nic_ptr->index);
00333               pkt_ptr->vip_pkt_conn_accept.net_local_vi_index =
00334                 VIP_HTON_UINT16 (vip_conn_ptr->vip_vi_ptr->index);
00335 
00336               vip_send_req_ptr->type |= VIP_SEND_REQ_RELIABLE;
00337               vip_send_req_ptr->dest_port_id = vip_conn_ptr->remote_port_id;
00338               vip_send_req_ptr->dest_gm_id = vip_conn_ptr->remote_gm_id;
00339               vip_send_req_ptr->vip_nic_ptr =
00340                 vip_conn_ptr->handle.vip_nic_ptr;
00341               vip_send_req_ptr->vip_vi_ptr = vip_conn_ptr->vip_vi_ptr;
00342               vip_send_data (vip_send_req_ptr);
00343 
00344               VIP_MUTEX_UNLOCK (&(vip_conn_ptr->handle.vip_nic_ptr->lock));
00345               VIP_DEBUG (("Success (peer model)"));
00346               return;
00347             }
00348         }
00349 
00350       VIP_ASSERT ((vip_conn_ptr->next_waiting_conn_ptr != NULL)
00351                   || (vip_conn_ptr == vip_gm_ptr->tail_waiting_conn_ptr));
00352       vip_tmp_conn_ptr = vip_conn_ptr->next_waiting_conn_ptr;
00353       VIP_MUTEX_UNLOCK (&(vip_conn_ptr->handle.vip_nic_ptr->lock));
00354       vip_conn_ptr = vip_tmp_conn_ptr;
00355     }
00356 
00357  send_nomatch:
00358   vip_send_req_ptr = vip_allocate_packet (vip_gm_ptr,
00359                                           sizeof (VIP_PACKET_CONN_NOMATCH));
00360   VIP_ASSERT (vip_send_req_ptr != NULL);
00361 
00362   /* fill the packet and send it */
00363   pkt_ptr = (VIP_PACKET *) (vip_send_req_ptr->ptr);
00364   pkt_ptr->vip_pkt_conn_nomatch.type = VIP_HTON_UCHAR (VIP_CONN_NOMATCH_PKT);
00365   pkt_ptr->vip_pkt_conn_nomatch.clt_seq_num = ptr->clt_seq_num;
00366   pkt_ptr->vip_pkt_conn_nomatch.clt_conn_ptr = ptr->clt_conn_ptr;
00367 
00368   vip_send_req_ptr->type |= VIP_SEND_REQ_RELIABLE;
00369   vip_send_req_ptr->dest_port_id = gm_ntohc (gm_event->recv.sender_port_id);
00370   vip_send_req_ptr->dest_gm_id = gm_ntohs (gm_event->recv.sender_node_id);
00371   vip_send_data (vip_send_req_ptr);
00372 
00373   VIP_DEBUG (("No match (client/server model)"));
00374   return;
00375 
00376  peer_reject:
00377   vip_send_req_ptr = vip_allocate_packet (vip_gm_ptr,
00378                                           sizeof (VIP_PACKET_CONN_REJECT));
00379   VIP_ASSERT (vip_send_req_ptr != NULL);
00380 
00381   /* fill the packet and send it */
00382   pkt_ptr = (VIP_PACKET *) (vip_send_req_ptr->ptr);
00383   pkt_ptr->vip_pkt_conn_reject.type =
00384     VIP_HTON_UCHAR (VIP_CONN_PEER_REJECT_PKT);
00385   pkt_ptr->vip_pkt_conn_reject.peer_status = VIP_HTON_UCHAR (peer_status);
00386   pkt_ptr->vip_pkt_conn_reject.clt_seq_num = ptr->clt_seq_num;
00387   pkt_ptr->vip_pkt_conn_reject.clt_conn_ptr = ptr->clt_conn_ptr;
00388 
00389   vip_send_req_ptr->type |= VIP_SEND_REQ_RELIABLE;
00390   vip_send_req_ptr->dest_port_id = gm_ntohc (gm_event->recv.sender_port_id);
00391   vip_send_req_ptr->dest_gm_id = gm_ntohs (gm_event->recv.sender_node_id);
00392   vip_send_req_ptr->vip_nic_ptr = vip_conn_ptr->handle.vip_nic_ptr;
00393   vip_send_req_ptr->vip_vi_ptr = vip_conn_ptr->vip_vi_ptr;
00394   vip_send_data (vip_send_req_ptr);
00395 
00396   gm_cancel_alarm (&(vip_conn_ptr->peer_timeout_alarm));
00397   vip_remove_conn_waiting_list (vip_gm_ptr, vip_conn_ptr);
00398   vip_conn_ptr->status = peer_status;
00399   VIP_EVENT_SIGNAL (&(vip_conn_ptr->event));
00400   VIP_MUTEX_UNLOCK (&(vip_conn_ptr->handle.vip_nic_ptr->lock));
00401   VIP_DEBUG (("Conn Peer request rejected"));
00402 }
00403 
00418 void
00419 vip_handle_conn_nomatch (VIP_PACKET_CONN_NOMATCH * ptr, VIP_GM * vip_gm_ptr)
00420 {
00421   VIP_CONN *vip_conn_ptr;
00422   VIP_UCHAR srv_port_id;
00423   VIP_NET_UINT32 srv_net_magic;
00424   VIP_DEBUG_LABEL (("vip_handle_conn_nomatch"));
00425 
00426   /* check conn handle ptr */
00427   vip_conn_ptr = 
00428     (VIP_CONN *) vip_addrbits2addr (VIP_NTOH_UINT64 (ptr->clt_conn_ptr));
00429   if (VIP_INVALID_CONN_HANDLE (vip_conn_ptr))
00430     {
00431       VIP_DEBUG (("Invalid CONN handle ptr in CONN_NOMATCH message"));
00432       return;
00433     }
00434   VIP_MUTEX_LOCK (&(vip_conn_ptr->handle.vip_nic_ptr->lock));
00435 
00436   /* check conn handle sequence number */
00437   if (VIP_NTOH_UINT16 (ptr->clt_seq_num) != vip_conn_ptr->handle.seq_num)
00438     {
00439       VIP_DEBUG (("Invalid CONN seq number in CONN_NOMATCH message"));
00440       VIP_MUTEX_UNLOCK (&(vip_conn_ptr->handle.vip_nic_ptr->lock));
00441       return;
00442     }
00443   VIP_ASSERT ((vip_conn_ptr->type == VIP_CONN_TYPE_CLIENT)
00444               || (vip_conn_ptr->type == VIP_CONN_TYPE_PEER));
00445 
00446   /* look for the next possible endpoint */
00447   srv_port_id = vip_conn_ptr->remote_port_id + 1;
00448   srv_net_magic = VIP_HTON_UINT32 (0);
00449   while (srv_port_id < VI_GM_MAX_PORTS)
00450     {
00451       if (VIP_NTOH_UINT32 (vip_conn_ptr->net_srv_magic[srv_port_id]) != 0)
00452         {
00453           srv_net_magic = vip_conn_ptr->net_srv_magic[srv_port_id];
00454           break;
00455         }
00456       srv_port_id++;
00457     }
00458 
00459   if (VIP_NTOH_UINT32 (srv_net_magic) == 0)
00460     {
00461       /* no luck, return NO_MATCH */
00462       if (vip_conn_ptr->type == VIP_CONN_TYPE_CLIENT)
00463         {
00464           vip_conn_ptr->status = VIP_NO_MATCH;
00465           VIP_EVENT_SIGNAL (&(vip_conn_ptr->event));
00466         }
00467       VIP_MUTEX_UNLOCK (&(vip_conn_ptr->handle.vip_nic_ptr->lock));
00468       VIP_DEBUG (("No match"));
00469       return;
00470     }
00471 
00472   /* we got another winner, send a connection request */
00473   vip_conn_ptr->remote_port_id = srv_port_id;
00474   vip_send_conn_request (vip_conn_ptr, vip_gm_ptr);
00475   VIP_MUTEX_UNLOCK (&(vip_conn_ptr->handle.vip_nic_ptr->lock));
00476   VIP_DEBUG (("Connection request sent to next endpoint"));
00477 }
00478 
00494 void
00495 vip_handle_conn_accept (VIP_PACKET_CONN_ACCEPT * ptr, 
00496                         gm_recv_event_t * gm_event, 
00497                         VIP_GM * vip_gm_ptr)
00498 {
00499   VIP_CONN *vip_conn_ptr;
00500   VIP_PACKET_CONN_ACK *pkt_ack_ptr;
00501   VIP_SEND_REQ *vip_send_req_ptr;
00502   VIP_DEBUG_LABEL (("vip_handle_conn_accept"));
00503 
00504   /* check conn handle ptr */
00505   vip_conn_ptr = 
00506     (VIP_CONN *) vip_addrbits2addr (VIP_NTOH_UINT64 (ptr->clt_conn_ptr));
00507   if (VIP_INVALID_CONN_HANDLE (vip_conn_ptr))
00508     {
00509       VIP_DEBUG (("Invalid CONN handle ptr in CONN_ACCEPT message"));
00510       goto sending_nack;
00511     }
00512   VIP_MUTEX_LOCK (&(vip_conn_ptr->handle.vip_nic_ptr->lock));
00513 
00514   /* check conn handle sequence number */
00515   if (VIP_NTOH_UINT16 (ptr->clt_seq_num) != vip_conn_ptr->handle.seq_num)
00516     {
00517       VIP_DEBUG (("Invalid CONN seq number in CONN_ACCEPT message"));
00518       VIP_MUTEX_UNLOCK (&(vip_conn_ptr->handle.vip_nic_ptr->lock));
00519       goto sending_nack;
00520     }
00521 
00522   vip_conn_ptr->net_remote_conn_ptr = ptr->srv_conn_ptr;
00523   vip_conn_ptr->net_remote_seq_num = ptr->srv_seq_num;
00524   vip_conn_ptr->remote_vi_attribs.EnableRdmaWrite =
00525     VIP_NTOH_UCHAR (ptr->rdma_write);
00526 
00527   /* connection established */
00528   vip_conn_ptr->vip_vi_ptr->net_remote_nic_index = ptr->net_local_nic_index;
00529   vip_conn_ptr->vip_vi_ptr->net_remote_vi_index = ptr->net_local_vi_index;
00530   vip_conn_ptr->vip_vi_ptr->gm_dest_id = vip_conn_ptr->remote_gm_id;
00531   vip_conn_ptr->vip_vi_ptr->gm_dest_port = vip_conn_ptr->remote_port_id;
00532 
00533   VIP_ASSERT ((vip_conn_ptr->type == VIP_CONN_TYPE_CLIENT)
00534               || (vip_conn_ptr->type == VIP_CONN_TYPE_PEER));
00535 
00536   if (vip_conn_ptr->type == VIP_CONN_TYPE_PEER)
00537     {
00538       vip_send_req_ptr = vip_allocate_packet (vip_gm_ptr,
00539                                               sizeof (VIP_PACKET_CONN_ACK));
00540       VIP_ASSERT (vip_send_req_ptr != NULL);
00541       pkt_ack_ptr = (VIP_PACKET_CONN_ACK *) (vip_send_req_ptr->ptr);
00542       pkt_ack_ptr->type = VIP_HTON_UCHAR (VIP_CONN_ACK_PKT);
00543       pkt_ack_ptr->status = VIP_HTON_UCHAR (VIP_SUCCESS);
00544       pkt_ack_ptr->srv_seq_num = ptr->srv_seq_num;
00545       pkt_ack_ptr->net_local_nic_index =
00546         VIP_HTON_UINT16 (vip_conn_ptr->vip_vi_ptr->handle.vip_nic_ptr->index);
00547       pkt_ack_ptr->net_local_vi_index = 
00548         VIP_HTON_UINT16 (vip_conn_ptr->vip_vi_ptr->index);
00549       pkt_ack_ptr->srv_conn_ptr = ptr->srv_conn_ptr;
00550 
00551       vip_send_req_ptr->type |= VIP_SEND_REQ_RELIABLE;
00552       vip_send_req_ptr->dest_port_id = vip_conn_ptr->remote_port_id;
00553       vip_send_req_ptr->dest_gm_id = vip_conn_ptr->remote_gm_id;
00554       vip_send_req_ptr->vip_nic_ptr = vip_conn_ptr->handle.vip_nic_ptr;
00555       vip_send_req_ptr->vip_vi_ptr = vip_conn_ptr->vip_vi_ptr;
00556       vip_send_data (vip_send_req_ptr);
00557 
00558       if (vip_conn_ptr->waiting_list == VIP_TRUE)
00559         {
00560           gm_cancel_alarm (&(vip_conn_ptr->peer_timeout_alarm));
00561           vip_remove_conn_waiting_list (vip_gm_ptr, vip_conn_ptr);
00562         }
00563     }
00564   else
00565     {
00566       vip_conn_ptr->vip_vi_ptr->state = VIP_STATE_CONNECTED;
00567     }
00568 
00569   vip_conn_ptr->status = VIP_SUCCESS;
00570   VIP_EVENT_SIGNAL (&(vip_conn_ptr->event));
00571   VIP_MUTEX_UNLOCK (&(vip_conn_ptr->handle.vip_nic_ptr->lock));
00572   VIP_DEBUG (("Success"));
00573   return;
00574 
00575  sending_nack:
00576   vip_send_req_ptr = vip_allocate_packet (vip_gm_ptr,
00577                                           sizeof (VIP_PACKET_CONN_ACK));
00578   VIP_ASSERT (vip_send_req_ptr != NULL);
00579   pkt_ack_ptr = (VIP_PACKET_CONN_ACK *) (vip_send_req_ptr->ptr);
00580   pkt_ack_ptr->type = VIP_HTON_UCHAR (VIP_CONN_ACK_PKT);
00581   pkt_ack_ptr->status = VIP_HTON_UCHAR (VIP_TIMEOUT);
00582   pkt_ack_ptr->srv_seq_num = ptr->srv_seq_num;
00583   pkt_ack_ptr->srv_conn_ptr = ptr->srv_conn_ptr;
00584 
00585   vip_send_req_ptr->type |= VIP_SEND_REQ_RELIABLE;
00586   vip_send_req_ptr->dest_port_id = gm_ntohc (gm_event->recv.sender_port_id);
00587   vip_send_req_ptr->dest_gm_id = gm_ntohs (gm_event->recv.sender_node_id);
00588   vip_send_data (vip_send_req_ptr);
00589 
00590   VIP_DEBUG (("CONN nACK sent back to server"));
00591   return;
00592 }
00593 
00606 void
00607 vip_handle_conn_reject (VIP_PACKET_CONN_REJECT * ptr)
00608 {
00609   VIP_CONN *vip_conn_ptr;
00610   VIP_DEBUG_LABEL (("vip_handle_conn_reject"));
00611 
00612   /* check conn handle ptr */
00613   vip_conn_ptr = 
00614     (VIP_CONN *) vip_addrbits2addr (VIP_NTOH_UINT64 (ptr->clt_conn_ptr));
00615   if (VIP_INVALID_CONN_HANDLE (vip_conn_ptr))
00616     {
00617       VIP_DEBUG (("Invalid CONN handle ptr in CONN_REJECT message"));
00618       return;
00619     }
00620   VIP_MUTEX_LOCK (&(vip_conn_ptr->handle.vip_nic_ptr->lock));
00621 
00622   /* check conn handle sequence number */
00623   if (VIP_NTOH_UINT16 (ptr->clt_seq_num) != vip_conn_ptr->handle.seq_num)
00624     {
00625       VIP_DEBUG (("Invalid CONN seq number in CONN_REJECT message"));
00626       VIP_MUTEX_UNLOCK (&(vip_conn_ptr->handle.vip_nic_ptr->lock));
00627       return;
00628     }
00629 
00630   if (VIP_NTOH_UCHAR (ptr->type) == VIP_CONN_REJECT_PKT)
00631     {
00632       VIP_ASSERT (vip_conn_ptr->type == VIP_CONN_TYPE_CLIENT);
00633       vip_conn_ptr->status = VIP_REJECT;
00634     }
00635   else
00636     {
00637       VIP_ASSERT (VIP_NTOH_UCHAR (ptr->type) == VIP_CONN_PEER_REJECT_PKT);
00638       VIP_ASSERT (vip_conn_ptr->type == VIP_CONN_TYPE_PEER);
00639       if (vip_conn_ptr->waiting_list == VIP_TRUE)
00640         {
00641           gm_cancel_alarm (&(vip_conn_ptr->peer_timeout_alarm));
00642           vip_remove_conn_waiting_list
00643             (vip_conn_ptr->handle.vip_nic_ptr->vip_gm_ptr, vip_conn_ptr);
00644         }
00645       vip_conn_ptr->status = VIP_NTOH_UCHAR (ptr->peer_status);
00646     }
00647 
00648   VIP_EVENT_SIGNAL (&(vip_conn_ptr->event));
00649   VIP_MUTEX_UNLOCK (&(vip_conn_ptr->handle.vip_nic_ptr->lock));
00650   VIP_DEBUG (("Success"));
00651 }
00652 
00665 void
00666 vip_handle_conn_ack (VIP_PACKET_CONN_ACK * ptr)
00667 {
00668   VIP_CONN *vip_conn_ptr;
00669   VIP_DEBUG_LABEL (("vip_handle_conn_ack"));
00670 
00671   /* check conn handle ptr */
00672   vip_conn_ptr = 
00673     (VIP_CONN *) vip_addrbits2addr (VIP_NTOH_UINT64 (ptr->srv_conn_ptr));
00674   if (VIP_INVALID_CONN_HANDLE (vip_conn_ptr))
00675     {
00676       VIP_DEBUG (("Invalid CONN handle ptr in CONN_ACK message"));
00677       return;
00678     }
00679   VIP_MUTEX_LOCK (&(vip_conn_ptr->handle.vip_nic_ptr->lock));
00680 
00681   /* check conn handle sequence number */
00682   if (VIP_NTOH_UINT16 (ptr->srv_seq_num) != vip_conn_ptr->handle.seq_num)
00683     {
00684       VIP_DEBUG (("Invalid CONN seq number in CONN_ACK message"));
00685       VIP_MUTEX_UNLOCK (&(vip_conn_ptr->handle.vip_nic_ptr->lock));
00686       return;
00687     }
00688 
00689   VIP_ASSERT ((vip_conn_ptr->type == VIP_CONN_TYPE_SERVER)
00690               || (vip_conn_ptr->type == VIP_CONN_TYPE_PEER));
00691   vip_conn_ptr->status = VIP_NTOH_UCHAR (ptr->status);
00692 
00693   if (vip_conn_ptr->status == VIP_SUCCESS)
00694     {
00695       /* connection established */
00696       vip_conn_ptr->vip_vi_ptr->net_remote_nic_index = 
00697         ptr->net_local_nic_index;
00698       vip_conn_ptr->vip_vi_ptr->net_remote_vi_index = ptr->net_local_vi_index;
00699       vip_conn_ptr->vip_vi_ptr->gm_dest_id = vip_conn_ptr->remote_gm_id;
00700       vip_conn_ptr->vip_vi_ptr->gm_dest_port = vip_conn_ptr->remote_port_id;
00701     }
00702 
00703   if (vip_conn_ptr->type == VIP_CONN_TYPE_SERVER)
00704     {
00705       vip_conn_ptr->vip_vi_ptr->state = VIP_STATE_CONNECTED;
00706     }
00707 
00708   VIP_EVENT_SIGNAL (&(vip_conn_ptr->event));
00709   VIP_MUTEX_UNLOCK (&(vip_conn_ptr->handle.vip_nic_ptr->lock));
00710   VIP_DEBUG (("Success"));
00711 }
VI-GM-1.3 by Myricom © 1997-2006. Documentation generated on 20 May 2006 by doxygen 1.4.4.