mirror of https://github.com/xemu-project/xemu.git
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:
parent
b248ede2ef
commit
b87ffa1631
76
slirp/if.c
76
slirp/if.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue