/*---------------------------------------------------------------------------*/ static void collision(struct rdc_buf_list *q, struct neighbor_queue *n, int num_transmissions) { struct qbuf_metadata *metadata; metadata = (struct qbuf_metadata *)q->ptr; csma_collisions += num_transmissions; n->collisions += num_transmissions; if(n->collisions > CSMA_MAX_BACKOFF) { n->collisions = CSMA_MIN_BE; /* Increment to indicate a next retry */ n->transmissions++; } if(n->transmissions >= metadata->max_transmissions) { csma_dropped++; tx_done(MAC_TX_COLLISION, q, n); } else { PRINTF("csma: rexmit collision %d\n", n->transmissions); rexmit(q, n); } }
static void rexmit_timer(ulong vp) { struct aoedev *d; struct frame *f, *e; struct sk_buff *sl; register long timeout; ulong flags, n; d = (struct aoedev *) vp; sl = NULL; /* timeout is always ~150% of the moving average */ timeout = d->rttavg; timeout += timeout >> 1; spin_lock_irqsave(&d->lock, flags); if (d->flags & DEVFL_TKILL) { spin_unlock_irqrestore(&d->lock, flags); return; } f = d->frames; e = f + d->nframes; for (; f<e; f++) { if (f->tag != FREETAG && tsince(f->tag) >= timeout) { n = f->waited += timeout; n /= HZ; if (n > aoe_deadsecs) { /* waited too long for response */ aoedev_downdev(d); break; } rexmit(d, f); } } if (d->flags & DEVFL_KICKME) { d->flags &= ~DEVFL_KICKME; aoecmd_work(d); } sl = d->sendq_hd; d->sendq_hd = d->sendq_tl = NULL; if (sl) { n = d->rttavg <<= 1; if (n > MAXTIMER) d->rttavg = MAXTIMER; } d->timer.expires = jiffies + TIMERTICK; add_timer(&d->timer); spin_unlock_irqrestore(&d->lock, flags); aoenet_xmit(sl); }
/*---------------------------------------------------------------------------*/ static void noack(struct rdc_buf_list *q, struct neighbor_queue *n, int num_transmissions) { struct qbuf_metadata *metadata; metadata = (struct qbuf_metadata *)q->ptr; csma_noack++; csma_sent_packets++; n->collisions = CSMA_MIN_BE; n->transmissions += num_transmissions; if(n->transmissions >= metadata->max_transmissions) { csma_dropped++; tx_done(MAC_TX_NOACK, q, n); } else { PRINTF("csma: rexmit noack %d\n", n->transmissions); rexmit(q, n); } }