int main (int argc, char **argv) { int times = (argc > 1)?atoi(argv[1]):100; int i, random, port=0, index=0, numPorts = 0; struct timeval tv; dirxn d; PortAlloc *pa; int *portList; gettimeofday(&tv, NULL); srand48(tv.tv_sec); portList = calloc(times, sizeof(int)); NetLogInit(); NetLogOpen((struct sockaddr_in *)NULL, 0, NETLOG_TERMINAL); NETLOG_SETLEVEL(MFCE, NETLOG_DEBUG4); NETLOG_SETLEVELE(MFCE, NETLOG_DEBUGMASK|NETLOG_ERRORMASK); pa = initPortAllocation(2, 10); for (i = 0; i < times; i++) { random = (rand() % 100); d = ((rand() % 100) < 40) ? rx : tx ; if (numPorts) index = rand() % numPorts; if (random < 70) { if ((random < 50) || (numPorts == 0)) { // get a new port port = 0; } else if (random < 70) { // choose an allocated port port = portList[index]; } // printf("allocating: port %d for %s\n", port, dirxn2str(d)); if ((port = allocPort(pa, port, d)) > 0) { portList[numPorts] = port; numPorts++; } // else { // printf("allocPort failed - %s port %d\n", dirxn2str(d), port); // } } else if (numPorts) { // free this port // printf("freeing: port %d for %s\n", portList[index], dirxn2str(d)); freePort(pa, portList[index], d); } printPorts(pa); } return 0; }
virtual void init(MemoryBuffer &data, MemoryBuffer &slaveData) override { mpTagRPC = container.queryJobChannel().deserializeMPTag(data); mptag_t barrierTag = container.queryJobChannel().deserializeMPTag(data); barrier.setown(container.queryJobChannel().createBarrier(barrierTag)); portbase = allocPort(NUMSLAVEPORTS); ActPrintLog("MSortSlaveActivity::init portbase = %d, mpTagRPC = %d",portbase,(int)mpTagRPC); server.setLocalHost(portbase); helper = (IHThorSortArg *)queryHelper(); sorter.setown(CreateThorSorter(this, server,&container.queryJob().queryIDiskUsage(),&queryJobChannel().queryJobComm(),mpTagRPC)); server.serialize(slaveData); }
// IThorSlaveActivity virtual void init(MemoryBuffer & data, MemoryBuffer &slaveData) override { if(!isLocal) { mpTagRPC = container.queryJobChannel().deserializeMPTag(data); mptag_t barrierTag = container.queryJobChannel().deserializeMPTag(data); barrier.setown(container.queryJobChannel().createBarrier(barrierTag)); portbase = allocPort(NUMSLAVEPORTS); server.setLocalHost(portbase); sorter.setown(CreateThorSorter(this, server,&container.queryJob().queryIDiskUsage(),&queryJobChannel().queryJobComm(),mpTagRPC)); server.serialize(slaveData); } compare = helper->queryCompareLeft(); // NB not CompareLeftRight keyserializer = helper->querySerializeLeft(); // hopefully never need right if(isLightweight) ActPrintLog("SELFJOIN: LIGHTWEIGHT"); else if(isLocal) ActPrintLog("SELFJOIN: LOCAL"); else ActPrintLog("SELFJOIN: GLOBAL"); }
// IThorSlaveActivity virtual void init(MemoryBuffer & data, MemoryBuffer &slaveData) { appendOutputLinked(this); if(!isLocal) { mpTagRPC = container.queryJob().deserializeMPTag(data); mptag_t barrierTag = container.queryJob().deserializeMPTag(data); barrier.setown(container.queryJob().createBarrier(barrierTag)); portbase = allocPort(NUMSLAVEPORTS); SocketEndpoint server; server.setLocalHost(portbase); sorter.setown(CreateThorSorter(this, server,&container.queryJob().queryIDiskUsage(),&container.queryJob().queryJobComm(),mpTagRPC)); server.serialize(slaveData); } helper = static_cast <IHThorJoinArg *> (queryHelper()); compare = helper->queryCompareLeft(); // NB not CompareLeftRight keyserializer = helper->querySerializeLeft(); // hopefully never need right if(isLightweight) ActPrintLog("SELFJOIN: LIGHTWEIGHT"); else if(isLocal) ActPrintLog("SELFJOIN: LOCAL"); else ActPrintLog("SELFJOIN: GLOBAL"); }
/** * Associate a UDP socket with a hardware device. * @param devptr UDP device table entry * @param ap 2nd argument is the local IP address * 3rd argument is the remote IP address * 4th argument is the local port (auto-assigned if zero) * 5th argument is the remote port * @return OK if UDP is opened properly, otherwise SYSERR */ devcall udpOpen(device *devptr, va_list ap) { struct udp *udpptr = NULL; ushort localpt = 0; ushort remotept = 0; struct netaddr *localip = NULL; struct netaddr *remoteip = NULL; irqmask im; udpptr = &udptab[devptr->minor]; im = disable(); /* Check if UDP is already open */ if (UDP_OPEN == udpptr->state) { UDP_TRACE("udp%d has already been opened.", devptr->minor); restore(im); return SYSERR; } udpptr->state = UDP_OPEN; udpptr->dev = devptr; /* Initialize incoming packet buffer */ udpptr->icount = 0; udpptr->istart = 0; /* Initialize the semaphore */ udpptr->isem = semcreate(0); /* Parse arguments */ localip = va_arg(ap, struct netaddr *); remoteip = va_arg(ap, struct netaddr *); localpt = va_arg(ap, int); remotept = va_arg(ap, int); /* Allocate a local port if none is specified */ if (NULL == localpt) { localpt = allocPort(); } /* Set remote port to 0 if none is specified */ if (NULL == remotept) { remotept = 0; } /* Local IP is required */ if (NULL == localip) { restore(im); return SYSERR; } if (NULL == remoteip) { bzero(&(udpptr->remoteip), sizeof(struct netaddr)); } /* Initialize ports and addresses */ udpptr->localpt = (ushort)localpt; udpptr->remotept = (ushort)remotept; if (NULL != localip) { netaddrcpy(&(udpptr->localip), localip); } if (NULL != remoteip) { netaddrcpy(&(udpptr->remoteip), remoteip); } /* Allocate received UDP packet buffer pool */ udpptr->inPool = bfpalloc(NET_MAX_PKTLEN, UDP_MAX_PKTS); UDP_TRACE("udp%d inPool has been assigned pool ID %d.\r\n", devptr->minor, udpptr->inPool); udpptr->flags = 0; restore(im); return OK; }
/** * @ingroup udpexternal * * Associate a UDP socket with local and remote IP addresses and ports, and * prepare it for receiving and sending data with udpRead() and udpWrite(). * * @param devptr * Device table entry for the UDP device. * * @param ap Four additional arguments, specifying the following in order: * - The local IP address. * - The remote IP address. May be @c NULL to create an initially * unbound socket. * - The local port. May be 0 to auto-assign a port number. * - The remote port. May be 0 if creating an initially unbound socket. * * @return ::OK if the UDP device was opened successfully; otherwise ::SYSERR. */ devcall udpOpen(device *devptr, va_list ap) { irqmask im; int retval; struct udp *udpptr; const struct netaddr *localip; const struct netaddr *remoteip; ushort localpt; ushort remotept; udpptr = &udptab[devptr->minor]; im = disable(); /* Check if UDP is already open */ if (UDP_OPEN == udpptr->state) { UDP_TRACE("udp%d has already been opened.", devptr->minor); retval = SYSERR; goto out_restore; } udpptr->state = UDP_OPEN; udpptr->dev = devptr; /* Initialize incoming packet buffer */ udpptr->icount = 0; udpptr->istart = 0; /* Initialize the semaphore */ udpptr->isem = semcreate(0); if (SYSERR == (int)udpptr->isem) { retval = SYSERR; goto out_udp_close; } /* Retrieve port and address arguments */ localip = va_arg(ap, const struct netaddr *); remoteip = va_arg(ap, const struct netaddr *); localpt = va_arg(ap, int); remotept = va_arg(ap, int); /* Initialize ports and addresses */ /* Local IP address is required */ if (NULL == localip) { retval = SYSERR; goto out_free_sem; } netaddrcpy(&udpptr->localip, localip); /* Remote IP address is not required */ if (NULL == remoteip) { bzero(&udpptr->remoteip, sizeof(struct netaddr)); } else { netaddrcpy(&udpptr->remoteip, remoteip); } /* Allocate a local port if none is specified */ if (0 == localpt) { localpt = allocPort(); } udpptr->localpt = localpt; udpptr->remotept = remotept; /* Allocate received UDP packet buffer pool */ udpptr->inPool = bfpalloc(NET_MAX_PKTLEN, UDP_MAX_PKTS); if (SYSERR == (int)udpptr->inPool) { retval = SYSERR; goto out_release_port; } UDP_TRACE("udp%d inPool has been assigned pool ID %d.\r\n", devptr->minor, udpptr->inPool); udpptr->flags = 0; retval = OK; goto out_restore; out_release_port: udpptr->localpt = 0; out_free_sem: semfree(udpptr->isem); out_udp_close: udpptr->state = UDP_FREE; out_restore: restore(im); return retval; }
/** * Associate a tcp with a network device. * @param devptr tcp device table entry * @param ap 2nd argument is the local IP address * 3rd argument is the remote IP address * 4th argument is the local port (auto-assigned if zero) * 5th argument is the remote port (ignored if zero) * 6th argument is the mode (TCP_ACTIVE or TCP_PASSIVE) * @return OK if TCP is opened properly, otherwise SYSERR */ devcall tcpOpen(device *devptr, va_list ap) { struct tcb *tcbptr = NULL; uchar mode; ushort localpt; struct netaddr *localip; ushort remotept; struct netaddr *remoteip; /* Setup pointer to tcp */ tcbptr = &tcptab[devptr->minor]; wait(tcbptr->mutex); /* Mark as allocated */ tcbptr->devstate = TCP_ALLOC; /* Verify device is not already open */ if ((tcbptr->state != TCP_CLOSED) && (tcbptr->state != TCP_LISTEN)) { signal(tcbptr->mutex); TCP_TRACE("Already open"); return SYSERR; } /* Obtain remaining arguments */ localip = (struct netaddr *)va_arg(ap, uint); remoteip = (struct netaddr *)va_arg(ap, uint); localpt = va_arg(ap, uint); remotept = va_arg(ap, uint); mode = va_arg(ap, uint); /* Verify local IP is specified */ if (NULL == localip) { tcbptr->devstate = TCP_FREE; signal(tcbptr->mutex); TCP_TRACE("Invalid args"); return SYSERR; } /* Allocate a local port if none is specified */ if (NULL == localpt) { localpt = allocPort(); } /* Mutually link tcp record with device table entry */ tcbptr->dev = devptr->num; /* Initialize port and ip fields */ tcbptr->localpt = localpt; netaddrcpy(&tcbptr->localip, localip); tcbptr->remotept = remotept; if (NULL == remoteip) { tcbptr->remoteip.type = NULL; } else { netaddrcpy(&tcbptr->remoteip, remoteip); } tcbptr->opentype = mode; /* Setup transmission control block */ if (SYSERR == tcpSetup(tcbptr)) { tcpFree(tcbptr); TCP_TRACE("Failed to setup TCB"); return SYSERR; } /* Perform appropriate action and change state */ switch (mode) { case TCP_PASSIVE: tcbptr->state = TCP_LISTEN; break; case TCP_ACTIVE: if (SYSERR == tcpOpenActive(tcbptr)) { tcpFree(tcbptr); TCP_TRACE("Failed to active open"); return SYSERR; } break; default: tcpFree(tcbptr); TCP_TRACE("Unknown mode"); return SYSERR; } signal(tcbptr->mutex); TCP_TRACE("Waiting for other side"); wait(tcbptr->openclose); /* Wait for connection open */ TCP_TRACE("Opened connection"); return OK; }