int delay_apply(void *d, struct pktq *pktq) { struct delay_data *data = (struct delay_data *)d; struct pkt *pkt; if (data->which == DELAY_FIRST) pkt = TAILQ_FIRST(pktq); else if (data->which == DELAY_LAST) pkt = TAILQ_LAST(pktq, pktq); else pkt = pktq_random(data->rnd, pktq); memcpy(&pkt->pkt_ts, &data->tv, sizeof(pkt->pkt_ts)); return (0); }
int drop_apply(void *d, struct pktq *pktq) { struct drop_data *data = (struct drop_data *)d; struct pkt *pkt; if (data->percent < 100 && (rand_uint16(data->rnd) % 100) > data->percent) return (0); if (data->which == DROP_FIRST) pkt = TAILQ_FIRST(pktq); else if (data->which == DROP_LAST) pkt = TAILQ_LAST(pktq, pktq); else pkt = pktq_random(data->rnd, pktq); TAILQ_REMOVE(pktq, pkt, pkt_next); pkt_free(pkt); return (0); }