aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2016-02-22 22:29:21 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2016-03-23 00:57:01 +0100
commit5428e4e471306b81259cae96187766a0b1049d1f (patch)
tree899fe540ef576a3d427a5cc0f644c857945a8b16
parentdfea7b819b3827e349b8a601ec339fce257e2cc3 (diff)
downloadslirp-5428e4e471306b81259cae96187766a0b1049d1f.zip
slirp-5428e4e471306b81259cae96187766a0b1049d1f.tar.gz
slirp-5428e4e471306b81259cae96187766a0b1049d1f.tar.bz2
Avoid embedding struct mbuf in other structures
struct mbuf uses a C99 open char array to allow inlining data. Inlining this in another structure is however a GNU extension. The inlines used so far in struct Slirp were actually only needed as head of struct mbuf lists. This replaces these inline with mere struct quehead, and use casts as appropriate. Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r--if.c28
-rw-r--r--mbuf.c19
-rw-r--r--misc.c5
-rw-r--r--misc.h5
-rw-r--r--slirp.h8
5 files changed, 34 insertions, 31 deletions
diff --git a/if.c b/if.c
index 57064a0..3a7d364 100644
--- a/if.c
+++ b/if.c
@@ -25,9 +25,9 @@ static void ifs_remque(struct mbuf *ifm)
void if_init(Slirp *slirp)
{
- slirp->if_fastq.ifq_next = slirp->if_fastq.ifq_prev = &slirp->if_fastq;
- slirp->if_batchq.ifq_next = slirp->if_batchq.ifq_prev = &slirp->if_batchq;
- slirp->next_m = &slirp->if_batchq;
+ 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;
}
/*
@@ -71,8 +71,8 @@ void if_output(struct socket *so, struct mbuf *ifm)
* order)
* XXX add cache here?
*/
- for (ifq = slirp->if_batchq.ifq_prev; ifq != &slirp->if_batchq;
- ifq = ifq->ifq_prev) {
+ for (ifq = (struct mbuf *)slirp->if_batchq.qh_rlink;
+ (struct quehead *)ifq != &slirp->if_batchq; ifq = ifq->ifq_prev) {
if (so == ifq->ifq_so) {
/* A match! */
ifm->ifq_so = so;
@@ -83,7 +83,7 @@ void if_output(struct socket *so, struct mbuf *ifm)
/* No match, check which queue to put it on */
if (so && (so->so_iptos & IPTOS_LOWDELAY)) {
- ifq = slirp->if_fastq.ifq_prev;
+ ifq = (struct mbuf *)slirp->if_fastq.qh_rlink;
on_fastq = 1;
/*
* Check if this packet is a part of the last
@@ -95,9 +95,9 @@ void if_output(struct socket *so, struct mbuf *ifm)
goto diddit;
}
} else {
- ifq = slirp->if_batchq.ifq_prev;
+ ifq = (struct mbuf *)slirp->if_batchq.qh_rlink;
/* Set next_m if the queue was empty so far */
- if (slirp->next_m == &slirp->if_batchq) {
+ if ((struct quehead *)slirp->next_m == &slirp->if_batchq) {
slirp->next_m = ifm;
}
}
@@ -162,10 +162,10 @@ void if_start(Slirp *slirp)
}
slirp->if_start_busy = true;
- if (slirp->if_fastq.ifq_next != &slirp->if_fastq) {
- ifm_next = slirp->if_fastq.ifq_next;
+ if (slirp->if_fastq.qh_link != &slirp->if_fastq) {
+ ifm_next = (struct mbuf *)slirp->if_fastq.qh_link;
next_from_batchq = false;
- } else if (slirp->next_m != &slirp->if_batchq) {
+ } 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;
@@ -178,12 +178,12 @@ void if_start(Slirp *slirp)
from_batchq = next_from_batchq;
ifm_next = ifm->ifq_next;
- if (ifm_next == &slirp->if_fastq) {
+ 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;
}
- if (ifm_next == &slirp->if_batchq) {
+ if ((struct quehead *)ifm_next == &slirp->if_batchq) {
/* end of batchq */
ifm_next = NULL;
}
@@ -214,7 +214,7 @@ void if_start(Slirp *slirp)
/* Next packet in fastq is from the same session */
ifm_next = next;
next_from_batchq = false;
- } else if (slirp->next_m == &slirp->if_batchq) {
+ } 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;
diff --git a/mbuf.c b/mbuf.c
index cfaa92c..498fa52 100644
--- a/mbuf.c
+++ b/mbuf.c
@@ -28,16 +28,16 @@
void m_init(Slirp *slirp)
{
- slirp->m_freelist.m_next = slirp->m_freelist.m_prev = &slirp->m_freelist;
- slirp->m_usedlist.m_next = slirp->m_usedlist.m_prev = &slirp->m_usedlist;
+ slirp->m_freelist.qh_link = slirp->m_freelist.qh_rlink = &slirp->m_freelist;
+ slirp->m_usedlist.qh_link = slirp->m_usedlist.qh_rlink = &slirp->m_usedlist;
}
void m_cleanup(Slirp *slirp)
{
struct mbuf *m, *next;
- m = slirp->m_usedlist.m_next;
- while (m != &slirp->m_usedlist) {
+ m = (struct mbuf *)slirp->m_usedlist.qh_link;
+ while ((struct quehead *)m != &slirp->m_usedlist) {
next = m->m_next;
if (m->m_flags & M_EXT) {
free(m->m_ext);
@@ -45,8 +45,8 @@ void m_cleanup(Slirp *slirp)
free(m);
m = next;
}
- m = slirp->m_freelist.m_next;
- while (m != &slirp->m_freelist) {
+ m = (struct mbuf *)slirp->m_freelist.qh_link;
+ while ((struct quehead *)m != &slirp->m_freelist) {
next = m->m_next;
free(m);
m = next;
@@ -68,7 +68,7 @@ struct mbuf *m_get(Slirp *slirp)
DEBUG_CALL("m_get");
- if (slirp->m_freelist.m_next == &slirp->m_freelist) {
+ if (slirp->m_freelist.qh_link == &slirp->m_freelist) {
m = (struct mbuf *)malloc(SLIRP_MSIZE);
if (m == NULL)
goto end_error;
@@ -77,7 +77,7 @@ struct mbuf *m_get(Slirp *slirp)
flags = M_DOFREE;
m->slirp = slirp;
} else {
- m = slirp->m_freelist.m_next;
+ m = (struct mbuf *)slirp->m_freelist.qh_link;
remque(m);
}
@@ -216,7 +216,8 @@ struct mbuf *dtom(Slirp *slirp, void *dat)
DEBUG_ARG("dat = %p", dat);
/* bug corrected for M_EXT buffers */
- for (m = slirp->m_usedlist.m_next; m != &slirp->m_usedlist; m = m->m_next) {
+ for (m = (struct mbuf *)slirp->m_usedlist.qh_link;
+ (struct quehead *)m != &slirp->m_usedlist; m = m->m_next) {
if (m->m_flags & M_EXT) {
if ((char *)dat >= m->m_ext && (char *)dat < (m->m_ext + m->m_size))
return m;
diff --git a/misc.c b/misc.c
index 22efe69..4ba970b 100644
--- a/misc.c
+++ b/misc.c
@@ -17,11 +17,6 @@
int slirp_debug = DBG_CALL | DBG_MISC | DBG_ERROR;
#endif
-struct quehead {
- struct quehead *qh_link;
- struct quehead *qh_rlink;
-};
-
inline void insque(void *a, void *b)
{
register struct quehead *element = (struct quehead *)a;
diff --git a/misc.h b/misc.h
index 706e633..966f8f2 100644
--- a/misc.h
+++ b/misc.h
@@ -45,6 +45,11 @@ struct emu_t {
struct emu_t *next;
};
+struct slirp_quehead {
+ struct slirp_quehead *qh_link;
+ struct slirp_quehead *qh_rlink;
+};
+
void slirp_insque(void *, void *);
void slirp_remque(void *);
int add_exec(struct ex_list **, int, char *, struct in_addr, int);
diff --git a/slirp.h b/slirp.h
index f7adc87..bf4e6c2 100644
--- a/slirp.h
+++ b/slirp.h
@@ -82,6 +82,7 @@ void free(void *ptr);
have different prototypes. */
#define insque slirp_insque
#define remque slirp_remque
+#define quehead slirp_quehead
#ifdef HAVE_SYS_STROPTS_H
#include <sys/stropts.h>
@@ -197,12 +198,13 @@ struct Slirp {
struct ex_list *exec_list;
/* mbuf states */
- struct mbuf m_freelist, m_usedlist;
+ struct quehead m_freelist;
+ struct quehead m_usedlist;
int mbuf_alloced;
/* if states */
- struct mbuf if_fastq; /* fast queue (for interactive data) */
- struct mbuf if_batchq; /* queue for non-interactive data */
+ struct quehead if_fastq; /* fast queue (for interactive data) */
+ struct quehead if_batchq; /* queue for non-interactive data */
struct mbuf *next_m; /* pointer to next mbuf to output */
bool if_start_busy; /* avoid if_start recursion */