#include "Simple.h" #include "Mad.h" #include "RcvIpcPorts.h" #define MAD_SIZE 512 void longswapheader(MadHeader *pmh) { U32 i; U32 *pl = (U32 *)pmh; for ( i = 0; i < sizeof(MadHeader) ; i+=4, pl++ ) { *pl = ntohl(*pl); } } int SendMad(U8 *buffer, int sd, struct sockaddr_in *send_addr, U16 attr) { MadHeader *pmh; fd_set fds; int bytes; printf("Press Enter to Send...\n"); getchar(); pmh = (MadHeader *)buffer; pmh->BaseVersion = 0; pmh->ClassId = Mad_Class_V_ComMgt; pmh->ClassVersion = 1; pmh->R = 0; pmh->MethodId = Method_CM_Send; /* 3== send */ pmh->Status = 0; pmh->ClassSpecific = 0; pmh->TransactionId = 0; pmh->AttributeId = attr; pmh->rsv0 = 0; pmh->AttributeModifier = 0; longswapheader(pmh); FD_ZERO(&fds); FD_SET(sd, &fds); if ((select(32/*sd+1*/, (fd_set *) 0, &fds, (fd_set *) 0, (struct timeval *) 0) < 1) || !FD_ISSET(sd, &fds)) { printf("select failed err %d\n", errno); return -1; } else { bytes = sendto(sd, buffer, MAD_SIZE, 0, (__SOCKADDR_ARG)send_addr, sizeof(struct sockaddr_in)); } return bytes; } int main(int argc, char *argv[]) { int sd, rc; int passive = 0; struct sockaddr_in addr, recv_addr, send_addr; MadHeader *pmh; U8 send_buffer[MAD_SIZE], receive_buffer[MAD_SIZE]; CommID lcid, rcid; sd= socket(PF_INET, SOCK_DGRAM, 0); printf("socket sd %d\n", sd); if ( sd == -1 ) { printf("socket failed\n"); } memset(&addr, 0, sizeof(addr)); memset(&recv_addr, 0, sizeof(recv_addr)); memset(&send_addr, 0, sizeof(send_addr)); memset(send_buffer, 0, sizeof(send_buffer)); memset(receive_buffer, 0, sizeof(receive_buffer)); addr.sin_family = PF_INET; addr.sin_addr.s_addr = INADDR_ANY; send_addr.sin_family = AF_INET; if ( (argc > 1) && (strcmp(argv[1],"passive") == 0) ) { passive = 1; send_addr.sin_port = htons(CMA_P_PORT); addr.sin_port = htons(IBIS_P_PORT); } else { passive = 0; send_addr.sin_port = htons(CMA_A_PORT); addr.sin_port = htons(IBIS_A_PORT); } send_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); if ( bind(sd, (struct sockaddr *)&addr, sizeof(addr)) != 0 ) { printf("bind failed\n"); } pmh = (MadHeader *)send_buffer; int i; if ( passive ) { for ( i=0; i < 1; i=1) { // receive a REQ rc = ReceiveMad(receive_buffer, sd, &recv_addr); if ( rc < 0 ) continue; lcid = ((MadPacket *)receive_buffer)->Payload.REQ.commID; rcid = ((MadPacket *)receive_buffer)->Payload.REQ.rsv0; printf("lcid %lu rcid %lu\n", lcid, rcid); // send REP ((MadPacket *)send_buffer)->Payload.REP.commID = lcid; ((MadPacket *)send_buffer)->Payload.REP.remCommID = rcid; rc = SendMad(send_buffer, sd, &send_addr, Attr_CM_ConnectReply); if ( rc < 0 ) continue; // receive an RTU rc = ReceiveMad(receive_buffer, sd, &recv_addr); if ( rc < 0 ) continue; // receive DREQ rc = ReceiveMad(receive_buffer, sd, &recv_addr); if ( rc < 0 ) continue; // send DREP ((MadPacket *)send_buffer)->Payload.REP.commID = lcid; ((MadPacket *)send_buffer)->Payload.REP.remCommID = rcid; rc = SendMad(send_buffer, sd, &send_addr, Attr_CM_DisconnectReply); if ( rc < 0 ) continue; } } else { for ( i=0; i < 1; i=1) { // send REQ rc = SendMad(send_buffer, sd, &send_addr, Attr_CM_ConnectRequest); if ( rc < 0 ) continue; // receive REP rc = ReceiveMad(receive_buffer, sd, &recv_addr); if ( rc < 0 ) continue; lcid = ((MadPacket *)receive_buffer)->Payload.REP.commID; rcid = ((MadPacket *)receive_buffer)->Payload.REP.remCommID; printf("lcid %lu rcid %lu\n", lcid, rcid); ((MadPacket *)send_buffer)->Payload.RTU.commID = lcid; ((MadPacket *)send_buffer)->Payload.RTU.remCommID = rcid; // send RTU rc = SendMad(send_buffer, sd, &send_addr, Attr_CM_ReadyToUse); if ( rc < 0 ) continue; // send DREQ ((MadPacket *)send_buffer)->Payload.DREQ.commID = lcid; ((MadPacket *)send_buffer)->Payload.DREQ.remCommID = rcid; rc = SendMad(send_buffer, sd, &send_addr, Attr_CM_DisconnectRequest); if ( rc < 0 ) continue; // receive DREP rc = ReceiveMad(receive_buffer, sd, &recv_addr); if ( rc < 0 ) continue; } } close(sd); return 0; }