예제 #1
0
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;
}
예제 #2
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);
 }
예제 #3
0
// 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");
    }
예제 #4
0
// 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");
    }
예제 #5
0
/**
 * 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;
}
예제 #6
0
파일: udpOpen.c 프로젝트: JamesLinus/xinu
/**
 * @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;
}
예제 #7
0
/**
 * 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;
}