aboutsummaryrefslogtreecommitdiff
path: root/slirp/if.c
diff options
context:
space:
mode:
Diffstat (limited to 'slirp/if.c')
-rw-r--r--slirp/if.c51
1 files changed, 17 insertions, 34 deletions
diff --git a/slirp/if.c b/slirp/if.c
index 51ae0d0e9a..6262d77495 100644
--- a/slirp/if.c
+++ b/slirp/if.c
@@ -30,7 +30,6 @@ if_init(Slirp *slirp)
{
slirp->if_fastq.qh_link = slirp->if_fastq.qh_rlink = &slirp->if_fastq;
slirp->if_batchq.qh_link = slirp->if_batchq.qh_rlink = &slirp->if_batchq;
- slirp->next_m = (struct mbuf *) &slirp->if_batchq;
}
/*
@@ -100,10 +99,6 @@ if_output(struct socket *so, struct mbuf *ifm)
}
} else {
ifq = (struct mbuf *) slirp->if_batchq.qh_rlink;
- /* Set next_m if the queue was empty so far */
- if ((struct quehead *) slirp->next_m == &slirp->if_batchq) {
- slirp->next_m = ifm;
- }
}
/* Create a new doubly linked list for this session */
@@ -143,21 +138,18 @@ diddit:
}
/*
- * Send a packet
- * We choose a packet based on its position in the output queues;
+ * Send one packet from each session.
* If there are packets on the fastq, they are sent FIFO, before
- * everything else. Otherwise we choose the first packet from the
- * batchq and send it. the next packet chosen will be from the session
- * after this one, then the session after that one, and so on.. So,
- * for example, if there are 3 ftp session's fighting for bandwidth,
+ * everything else. Then we choose the first packet from each
+ * batchq session (socket) and send it.
+ * For example, if there are 3 ftp sessions fighting for bandwidth,
* one packet will be sent from the first session, then one packet
- * from the second session, then one packet from the third, then back
- * to the first, etc. etc.
+ * from the second session, then one packet from the third.
*/
void if_start(Slirp *slirp)
{
uint64_t now = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
- bool from_batchq, next_from_batchq;
+ bool from_batchq = false;
struct mbuf *ifm, *ifm_next, *ifqt;
DEBUG_CALL("if_start");
@@ -167,26 +159,29 @@ void if_start(Slirp *slirp)
}
slirp->if_start_busy = true;
+ struct mbuf *batch_head = NULL;
+ if (slirp->if_batchq.qh_link != &slirp->if_batchq) {
+ batch_head = (struct mbuf *) slirp->if_batchq.qh_link;
+ }
+
if (slirp->if_fastq.qh_link != &slirp->if_fastq) {
ifm_next = (struct mbuf *) slirp->if_fastq.qh_link;
- next_from_batchq = false;
- } else if ((struct quehead *) slirp->next_m != &slirp->if_batchq) {
- /* Nothing on fastq, pick up from batchq via next_m */
- ifm_next = slirp->next_m;
- next_from_batchq = true;
+ } else if (batch_head) {
+ /* Nothing on fastq, pick up from batchq */
+ ifm_next = batch_head;
+ from_batchq = true;
} else {
ifm_next = NULL;
}
while (ifm_next) {
ifm = ifm_next;
- from_batchq = next_from_batchq;
ifm_next = ifm->ifq_next;
if ((struct quehead *) ifm_next == &slirp->if_fastq) {
/* No more packets in fastq, switch to batchq */
- ifm_next = slirp->next_m;
- next_from_batchq = true;
+ ifm_next = batch_head;
+ from_batchq = true;
}
if ((struct quehead *) ifm_next == &slirp->if_batchq) {
/* end of batchq */
@@ -199,11 +194,6 @@ void if_start(Slirp *slirp)
continue;
}
- if (ifm == slirp->next_m) {
- /* Set which packet to send on next iteration */
- slirp->next_m = ifm->ifq_next;
- }
-
/* Remove it from the queue */
ifqt = ifm->ifq_prev;
remque(ifm);
@@ -214,15 +204,8 @@ void if_start(Slirp *slirp)
insque(next, ifqt);
ifs_remque(ifm);
-
if (!from_batchq) {
- /* Next packet in fastq is from the same session */
ifm_next = next;
- next_from_batchq = false;
- } else if ((struct quehead *) slirp->next_m == &slirp->if_batchq) {
- /* Set next_m and ifm_next if the session packet is now the
- * only one on batchq */
- slirp->next_m = ifm_next = next;
}
}