Beispiel #1
0
static int
deliverSWP(SwpState state, Msg *frame)
{
    SwpHdr hdr;
    char *hbuf;
    
    hbuf = msgStripHdr(frame, HLEN);
    load_swp_hdr(&hdr, hbuf);
    if (hdr->Flags & FLAG_ACK_VALID)
    {
        if (swpInWindow(hdr.AckNum, state->LAR + 1, state->LFS))
        {
            do {
                struct sendQ_slot *slot;
                slot = &state->sendQ[++state->LAR % SWS];
                evCancel(slot->timeout);
                msgDestroy(&slot->msg);
                semSignal(&state->sendWindowNotFull);
            } while (state->LAR != hdr.Acknum);
        }
    }

    if (hdr.Flags & FLAG_HAS_DATA)
    {
        struct recvQ_slot, *slot;
        //received data packet---do RECEIVER side
        slot = &state->recvQ[hdr.SeqNum % RWS];
        if (!swpInWindow(hdr.SeqNum, state->NFE, 
                    state->NFE + RWS - 1)) {
            //drop the message
            return SUCCESS;
        }
        msgSaveCopy(&slot->msg, frame);
        slot->received = TRUE;
        if (hdr.SeqNum == state->NFE) {
            Msg m;
            
            while (slot->received) {
                deliver(HLP, &slot->msg);
                msgDestroy(&slot->msg);
                slot->received = FALSE;
                slot = &state->recvQ[++state->NFE % RWS];
            }
            //send ACK
            prepare_ack(&m, state->NFE - 1);
            send(LINK, &m);
            msgDestroy(&m);
        }
    }
    return SUCCESS;

}
Beispiel #2
0
int
tryPush( XObj self, XObj sessn, int times, int length )
{
    xkern_return_t xkr;
    int i;
    Msg_s	savedMsg, request;
    int c = 0;
    PState 	*ps = (PState *)self->state;
#if MACH_KERNEL
    tvalspec_t  time_val_before, time_val_after;
#endif /* MACH_KERNEL */
    
    xkr = msgConstructContig(&savedMsg, self->path,
				 (u_int)length,
				 TEST_STACK_SIZE);
    if (xkr == XK_FAILURE) {
	sprintf(errBuf, "Could not construct a msg of length %d\n", 
		length + TEST_STACK_SIZE);
	Kabort(errBuf);
    }
    msgConstructContig(&request, self->path, 0, 0);
    semInit(&ps->sema, 0);
    ps->flushing = FALSE;
    ps->partialcount = times - 1;
#if  MACH_KERNEL
    rtc_gettime(&ps->starttime);
    rtc_gettime(&ps->partialtime);
#else
    xGetTime(&ps->starttime);
#endif /* MACH_KERNEL */
    for (i = 0; i < ps->groupsize; i++) {
	msgAssign(&request, &savedMsg);
	xkr = xPush(sessn, &request);
	if( xkr == XK_FAILURE ) {
	    printf( "Dgram Push error %d\n" , xkr ); 
	    goto abort;
	}
    }
    evSchedule(ps->evdgram, dgram_abort, self, 30000000);
    semWait(&ps->sema);
    evCancel(ps->evdgram);
    
 abort:
    msgDestroy(&savedMsg);
    msgDestroy(&request);
    return (times - ps->partialcount);
}