00001
00002
00003
00004
00005
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
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
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
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
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
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
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
00200 if (VIP_NTOH_UINT32 (ptr->srv_net_magic) != vip_gm_ptr->magic)
00201 {
00202 goto send_nomatch;
00203 }
00204
00205
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
00213 if (VIP_NTOH_UCHAR (ptr->type) == VIP_CONN_REQ_PKT)
00214 {
00215
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 }