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; }
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); }