slirp: Refactor if_start

Replace gotos with a while loop, fix coding style.

CC: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
CC: Fabien Chouteau <chouteau@adacore.com>
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
This commit is contained in:
Jan Kiszka 2012-02-17 16:35:36 +01:00
parent b248ede2ef
commit b87ffa1631
1 changed files with 35 additions and 41 deletions

View File

@ -149,39 +149,36 @@ diddit:
* from the second session, then one packet from the third, then back * from the second session, then one packet from the third, then back
* to the first, etc. etc. * to the first, etc. etc.
*/ */
void void if_start(Slirp *slirp)
if_start(Slirp *slirp)
{ {
uint64_t now = qemu_get_clock_ns(rt_clock); uint64_t now = qemu_get_clock_ns(rt_clock);
int requeued = 0; int requeued = 0;
bool from_batchq = false; bool from_batchq = false;
struct mbuf *ifm, *ifqt; struct mbuf *ifm, *ifqt;
DEBUG_CALL("if_start"); DEBUG_CALL("if_start");
if (slirp->if_queued == 0) while (slirp->if_queued) {
return; /* Nothing to do */
again:
/* check if we can really output */ /* check if we can really output */
if (!slirp_can_output(slirp->opaque)) if (!slirp_can_output(slirp->opaque))
return; return;
/* /*
* See which queue to get next packet from * See which queue to get next packet from
* If there's something in the fastq, select it immediately * If there's something in the fastq, select it immediately
*/ */
if (slirp->if_fastq.ifq_next != &slirp->if_fastq) { if (slirp->if_fastq.ifq_next != &slirp->if_fastq) {
ifm = slirp->if_fastq.ifq_next; ifm = slirp->if_fastq.ifq_next;
} else { } else {
/* Nothing on fastq, see if next_m is valid */ /* Nothing on fastq, see if next_m is valid */
if (slirp->next_m != &slirp->if_batchq) if (slirp->next_m != &slirp->if_batchq) {
ifm = slirp->next_m; ifm = slirp->next_m;
else } else {
ifm = slirp->if_batchq.ifq_next; ifm = slirp->if_batchq.ifq_next;
}
from_batchq = true; from_batchq = true;
} }
slirp->if_queued--; slirp->if_queued--;
@ -189,7 +186,7 @@ if_start(Slirp *slirp)
if (ifm->expiration_date >= now && !if_encap(slirp, ifm)) { if (ifm->expiration_date >= now && !if_encap(slirp, ifm)) {
/* Packet is delayed due to pending ARP resolution */ /* Packet is delayed due to pending ARP resolution */
requeued++; requeued++;
goto out; continue;
} }
if (from_batchq) { if (from_batchq) {
@ -197,28 +194,25 @@ if_start(Slirp *slirp)
slirp->next_m = ifm->ifq_next; slirp->next_m = ifm->ifq_next;
} }
/* Remove it from the queue */ /* Remove it from the queue */
ifqt = ifm->ifq_prev; ifqt = ifm->ifq_prev;
remque(ifm); remque(ifm);
/* If there are more packets for this session, re-queue them */ /* If there are more packets for this session, re-queue them */
if (ifm->ifs_next != /* ifm->ifs_prev != */ ifm) { if (ifm->ifs_next != ifm) {
insque(ifm->ifs_next, ifqt); insque(ifm->ifs_next, ifqt);
ifs_remque(ifm); ifs_remque(ifm);
} }
/* Update so_queued */ /* Update so_queued */
if (ifm->ifq_so) { if (ifm->ifq_so && --ifm->ifq_so->so_queued == 0) {
if (--ifm->ifq_so->so_queued == 0) /* If there's no more queued, reset nqueued */
/* If there's no more queued, reset nqueued */ ifm->ifq_so->so_nqueued = 0;
ifm->ifq_so->so_nqueued = 0; }
}
m_free(ifm); m_free(ifm);
out: }
if (slirp->if_queued)
goto again;
slirp->if_queued = requeued; slirp->if_queued = requeued;
} }