From patchwork Wed Feb 15 18:45:15 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Michael S. Tsirkin" X-Patchwork-Id: 141381 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 58EF11007D6 for ; Thu, 16 Feb 2012 05:45:46 +1100 (EST) Received: from localhost ([::1]:58082 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RxjrJ-0000iE-Gx for incoming@patchwork.ozlabs.org; Wed, 15 Feb 2012 13:45:41 -0500 Received: from eggs.gnu.org ([140.186.70.92]:58381) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Rxjr1-0000d7-Tx for qemu-devel@nongnu.org; Wed, 15 Feb 2012 13:45:32 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Rxjqs-0004rw-Nc for qemu-devel@nongnu.org; Wed, 15 Feb 2012 13:45:23 -0500 Received: from mx1.redhat.com ([209.132.183.28]:26357) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Rxjqs-0004rc-4O for qemu-devel@nongnu.org; Wed, 15 Feb 2012 13:45:14 -0500 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1FIjC0m027327 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 15 Feb 2012 13:45:12 -0500 Received: from redhat.com (vpn-203-212.tlv.redhat.com [10.35.203.212]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id q1FIj8Hl025259; Wed, 15 Feb 2012 13:45:09 -0500 Date: Wed, 15 Feb 2012 20:45:15 +0200 From: "Michael S. Tsirkin" To: qemu-devel@nongnu.org Message-ID: <20120215184515.GA32249@redhat.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.132.183.28 Cc: Jan Kiszka Subject: [Qemu-devel] [PATCH] slirp: kill ugly macros X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Remove ugly macros for field names, change done by the following script: s#\bifq_prev\b#m_prev#g; s#\bifq_next\b#m_next#g; s#\bifs_prev\b#m_prevpkt#g; s#\bifs_next\b#m_nextpkt#g; s#\bifq_so\b#m_so#g; s#\bm_next\b#m_hdr.mh_next#g; s#\bm_prev\b#m_hdr.mh_prev#g; s#\bm_nextpkt\b#m_hdr.mh_nextpkt#g; s#\bm_prevpkt\b#m_hdr.mh_prevpkt#g; s#\bm_flags\b#m_hdr.mh_flags#g; s#\bm_len\b#m_hdr.mh_len#g; s#\bm_data\b#m_hdr.mh_data#g; s#\bm_size\b#m_hdr.mh_size#g; s#\bm_dat\b#M_dat.m_dat_#g; s#\bm_ext\b#M_dat.m_ext_#g; s#\bm_so\b#m_hdr.mh_so#g; Signed-off-by: Michael S. Tsirkin --- Lightly tested, WFM slirp/bootp.c | 8 ++-- slirp/cksum.c | 4 +- slirp/if.c | 70 +++++++++++++++++++++--------------------- slirp/if.h | 2 +- slirp/ip.h | 2 +- slirp/ip_icmp.c | 64 +++++++++++++++++++------------------- slirp/ip_input.c | 34 ++++++++++---------- slirp/ip_output.c | 14 ++++---- slirp/mbuf.c | 86 ++++++++++++++++++++++++++-------------------------- slirp/mbuf.h | 36 +++++---------------- slirp/sbuf.c | 20 ++++++------ slirp/slirp.c | 16 +++++----- slirp/socket.c | 12 ++++---- slirp/tcp_input.c | 18 +++++----- slirp/tcp_output.c | 14 ++++---- slirp/tcp_subr.c | 62 +++++++++++++++++++------------------- slirp/tftp.c | 38 +++++++++++----------- slirp/udp.c | 26 ++++++++-------- 18 files changed, 254 insertions(+), 272 deletions(-) diff --git a/slirp/bootp.c b/slirp/bootp.c index efd1fe7..84c1182 100644 --- a/slirp/bootp.c +++ b/slirp/bootp.c @@ -173,9 +173,9 @@ static void bootp_reply(Slirp *slirp, const struct bootp_t *bp) if (!m) { return; } - m->m_data += IF_MAXLINKHDR; - rbp = (struct bootp_t *)m->m_data; - m->m_data += sizeof(struct udpiphdr); + m->m_hdr.mh_data += IF_MAXLINKHDR; + rbp = (struct bootp_t *)m->m_hdr.mh_data; + m->m_hdr.mh_data += sizeof(struct udpiphdr); memset(rbp, 0, sizeof(struct bootp_t)); if (dhcp_msg_type == DHCPDISCOVER) { @@ -304,7 +304,7 @@ static void bootp_reply(Slirp *slirp, const struct bootp_t *bp) daddr.sin_addr.s_addr = 0xffffffffu; - m->m_len = sizeof(struct bootp_t) - + m->m_hdr.mh_len = sizeof(struct bootp_t) - sizeof(struct ip) - sizeof(struct udphdr); udp_output2(NULL, m, &saddr, &daddr, IPTOS_LOWDELAY); } diff --git a/slirp/cksum.c b/slirp/cksum.c index e43867d..123dead 100644 --- a/slirp/cksum.c +++ b/slirp/cksum.c @@ -61,11 +61,11 @@ int cksum(struct mbuf *m, int len) uint32_t l; } l_util; - if (m->m_len == 0) + if (m->m_hdr.mh_len == 0) goto cont; w = mtod(m, uint16_t *); - mlen = m->m_len; + mlen = m->m_hdr.mh_len; if (len < mlen) mlen = len; diff --git a/slirp/if.c b/slirp/if.c index 2852396..8a4ea63 100644 --- a/slirp/if.c +++ b/slirp/if.c @@ -8,29 +8,29 @@ #include #include "qemu-timer.h" -#define ifs_init(ifm) ((ifm)->ifs_next = (ifm)->ifs_prev = (ifm)) +#define ifs_init(ifm) ((ifm)->m_hdr.mh_nextpkt = (ifm)->m_hdr.mh_prevpkt = (ifm)) static void ifs_insque(struct mbuf *ifm, struct mbuf *ifmhead) { - ifm->ifs_next = ifmhead->ifs_next; - ifmhead->ifs_next = ifm; - ifm->ifs_prev = ifmhead; - ifm->ifs_next->ifs_prev = ifm; + ifm->m_hdr.mh_nextpkt = ifmhead->m_hdr.mh_nextpkt; + ifmhead->m_hdr.mh_nextpkt = ifm; + ifm->m_hdr.mh_prevpkt = ifmhead; + ifm->m_hdr.mh_nextpkt->m_hdr.mh_prevpkt = ifm; } static void ifs_remque(struct mbuf *ifm) { - ifm->ifs_prev->ifs_next = ifm->ifs_next; - ifm->ifs_next->ifs_prev = ifm->ifs_prev; + ifm->m_hdr.mh_prevpkt->m_hdr.mh_nextpkt = ifm->m_hdr.mh_nextpkt; + ifm->m_hdr.mh_nextpkt->m_hdr.mh_prevpkt = ifm->m_hdr.mh_prevpkt; } 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->if_fastq.m_hdr.mh_next = slirp->if_fastq.m_hdr.mh_prev = &slirp->if_fastq; + slirp->if_batchq.m_hdr.mh_next = slirp->if_batchq.m_hdr.mh_prev = &slirp->if_batchq; slirp->next_m = &slirp->if_batchq; } @@ -60,12 +60,12 @@ if_output(struct socket *so, struct mbuf *ifm) /* * First remove the mbuf from m_usedlist, - * since we're gonna use m_next and m_prev ourselves + * since we're gonna use m_hdr.mh_next and m_hdr.mh_prev ourselves * XXX Shouldn't need this, gotta change dtom() etc. */ - if (ifm->m_flags & M_USEDLIST) { + if (ifm->m_hdr.mh_flags & M_USEDLIST) { remque(ifm); - ifm->m_flags &= ~M_USEDLIST; + ifm->m_hdr.mh_flags &= ~M_USEDLIST; } /* @@ -75,34 +75,34 @@ if_output(struct socket *so, struct mbuf *ifm) * We mustn't put this packet back on the fastq (or we'll send it out of order) * XXX add cache here? */ - for (ifq = slirp->if_batchq.ifq_prev; ifq != &slirp->if_batchq; - ifq = ifq->ifq_prev) { - if (so == ifq->ifq_so) { + for (ifq = slirp->if_batchq.m_hdr.mh_prev; ifq != &slirp->if_batchq; + ifq = ifq->m_hdr.mh_prev) { + if (so == ifq->m_hdr.mh_so) { /* A match! */ - ifm->ifq_so = so; - ifs_insque(ifm, ifq->ifs_prev); + ifm->m_hdr.mh_so = so; + ifs_insque(ifm, ifq->m_hdr.mh_prevpkt); goto diddit; } } /* No match, check which queue to put it on */ if (so && (so->so_iptos & IPTOS_LOWDELAY)) { - ifq = slirp->if_fastq.ifq_prev; + ifq = slirp->if_fastq.m_hdr.mh_prev; on_fastq = 1; /* * Check if this packet is a part of the last * packet's session */ - if (ifq->ifq_so == so) { - ifm->ifq_so = so; - ifs_insque(ifm, ifq->ifs_prev); + if (ifq->m_hdr.mh_so == so) { + ifm->m_hdr.mh_so = so; + ifs_insque(ifm, ifq->m_hdr.mh_prevpkt); goto diddit; } } else - ifq = slirp->if_batchq.ifq_prev; + ifq = slirp->if_batchq.m_hdr.mh_prev; /* Create a new doubly linked list for this session */ - ifm->ifq_so = so; + ifm->m_hdr.mh_so = so; ifs_init(ifm); insque(ifm, ifq); @@ -124,10 +124,10 @@ diddit: (so->so_nqueued - so->so_queued) >= 3)) { /* Remove from current queue... */ - remque(ifm->ifs_next); + remque(ifm->m_hdr.mh_nextpkt); /* ...And insert in the new. That'll teach ya! */ - insque(ifm->ifs_next, &slirp->if_batchq); + insque(ifm->m_hdr.mh_nextpkt, &slirp->if_batchq); } } @@ -172,34 +172,34 @@ if_start(Slirp *slirp) * See which queue to get next packet from * If there's something in the fastq, select it immediately */ - if (slirp->if_fastq.ifq_next != &slirp->if_fastq) { - ifm = slirp->if_fastq.ifq_next; + if (slirp->if_fastq.m_hdr.mh_next != &slirp->if_fastq) { + ifm = slirp->if_fastq.m_hdr.mh_next; } else { /* Nothing on fastq, see if next_m is valid */ if (slirp->next_m != &slirp->if_batchq) ifm = slirp->next_m; else - ifm = slirp->if_batchq.ifq_next; + ifm = slirp->if_batchq.m_hdr.mh_next; /* Set which packet to send on next iteration */ - slirp->next_m = ifm->ifq_next; + slirp->next_m = ifm->m_hdr.mh_next; } /* Remove it from the queue */ - ifqt = ifm->ifq_prev; + ifqt = ifm->m_hdr.mh_prev; remque(ifm); slirp->if_queued--; /* If there are more packets for this session, re-queue them */ - if (ifm->ifs_next != /* ifm->ifs_prev != */ ifm) { - insque(ifm->ifs_next, ifqt); + if (ifm->m_hdr.mh_nextpkt != /* ifm->m_hdr.mh_prevpkt != */ ifm) { + insque(ifm->m_hdr.mh_nextpkt, ifqt); ifs_remque(ifm); } /* Update so_queued */ - if (ifm->ifq_so) { - if (--ifm->ifq_so->so_queued == 0) + if (ifm->m_hdr.mh_so) { + if (--ifm->m_hdr.mh_so->so_queued == 0) /* If there's no more queued, reset nqueued */ - ifm->ifq_so->so_nqueued = 0; + ifm->m_hdr.mh_so->so_nqueued = 0; } if (ifm->expiration_date < now) { diff --git a/slirp/if.h b/slirp/if.h index 2dac1c7..e0d426e 100644 --- a/slirp/if.h +++ b/slirp/if.h @@ -20,6 +20,6 @@ /* 2 for alignment, 14 for ethernet, 40 for TCP/IP */ #define IF_MAXLINKHDR (2 + 14 + 40) -#define ifs_init(ifm) ((ifm)->ifs_next = (ifm)->ifs_prev = (ifm)) +#define ifs_init(ifm) ((ifm)->m_hdr.mh_nextpkt = (ifm)->m_hdr.mh_prevpkt = (ifm)) #endif diff --git a/slirp/ip.h b/slirp/ip.h index 88c903f..5dc1a8a 100644 --- a/slirp/ip.h +++ b/slirp/ip.h @@ -241,7 +241,7 @@ struct ipasfrag { * Structure stored in mbuf in inpcb.ip_options * and passed to ip_output when ip options are in use. * The actual length of the options (including ipopt_dst) - * is in m_len. + * is in m_hdr.mh_len. */ #define MAX_IPOPTLEN 40 diff --git a/slirp/ip_icmp.c b/slirp/ip_icmp.c index 4b43994..243f303 100644 --- a/slirp/ip_icmp.c +++ b/slirp/ip_icmp.c @@ -89,7 +89,7 @@ static int icmp_send(struct socket *so, struct mbuf *m, int hlen) insque(so, &so->slirp->icmp); - if (sendto(so->s, m->m_data + hlen, m->m_len - hlen, 0, + if (sendto(so->s, m->m_hdr.mh_data + hlen, m->m_hdr.mh_len - hlen, 0, (struct sockaddr *)&addr, sizeof(addr)) == -1) { DEBUG_MISC((dfd, "icmp_input icmp sendto tx errno = %d-%s\n", errno, strerror(errno))); @@ -119,7 +119,7 @@ icmp_input(struct mbuf *m, int hlen) DEBUG_CALL("icmp_input"); DEBUG_ARG("m = %lx", (long )m); - DEBUG_ARG("m_len = %d", m->m_len); + DEBUG_ARG("m_hdr.mh_len = %d", m->m_hdr.mh_len); /* * Locate icmp structure in mbuf, and check @@ -131,14 +131,14 @@ icmp_input(struct mbuf *m, int hlen) goto end_error; } - m->m_len -= hlen; - m->m_data += hlen; + m->m_hdr.mh_len -= hlen; + m->m_hdr.mh_data += hlen; icp = mtod(m, struct icmp *); if (cksum(m, icmplen)) { goto freeit; } - m->m_len += hlen; - m->m_data -= hlen; + m->m_hdr.mh_len += hlen; + m->m_hdr.mh_data -= hlen; DEBUG_ARG("icmp_type = %d", icp->icmp_type); switch (icp->icmp_type) { @@ -246,7 +246,7 @@ icmp_error(struct mbuf *msrc, u_char type, u_char code, int minsize, DEBUG_CALL("icmp_error"); DEBUG_ARG("msrc = %lx", (long )msrc); - DEBUG_ARG("msrc_len = %d", msrc->m_len); + DEBUG_ARG("msrc_len = %d", msrc->m_hdr.mh_len); if(type!=ICMP_UNREACH && type!=ICMP_TIMXCEED) goto end_error; @@ -280,19 +280,19 @@ icmp_error(struct mbuf *msrc, u_char type, u_char code, int minsize, } { int new_m_size; - new_m_size=sizeof(struct ip )+ICMP_MINLEN+msrc->m_len+ICMP_MAXDATALEN; - if(new_m_size>m->m_size) m_inc(m, new_m_size); + new_m_size=sizeof(struct ip )+ICMP_MINLEN+msrc->m_hdr.mh_len+ICMP_MAXDATALEN; + if(new_m_size>m->m_hdr.mh_size) m_inc(m, new_m_size); } - memcpy(m->m_data, msrc->m_data, msrc->m_len); - m->m_len = msrc->m_len; /* copy msrc to m */ + memcpy(m->m_hdr.mh_data, msrc->m_hdr.mh_data, msrc->m_hdr.mh_len); + m->m_hdr.mh_len = msrc->m_hdr.mh_len; /* copy msrc to m */ /* make the header of the reply packet */ ip = mtod(m, struct ip *); hlen= sizeof(struct ip ); /* no options in reply */ /* fill in icmp */ - m->m_data += hlen; - m->m_len -= hlen; + m->m_hdr.mh_data += hlen; + m->m_hdr.mh_len -= hlen; icp = mtod(m, struct icmp *); @@ -300,7 +300,7 @@ icmp_error(struct mbuf *msrc, u_char type, u_char code, int minsize, else if(s_ip_len>ICMP_MAXDATALEN) /* maximum size */ s_ip_len=ICMP_MAXDATALEN; - m->m_len=ICMP_MINLEN+s_ip_len; /* 8 bytes ICMP header */ + m->m_hdr.mh_len=ICMP_MINLEN+s_ip_len; /* 8 bytes ICMP header */ /* min. size = 8+sizeof(struct ip)+8 */ @@ -309,7 +309,7 @@ icmp_error(struct mbuf *msrc, u_char type, u_char code, int minsize, icp->icmp_id = 0; icp->icmp_seq = 0; - memcpy(&icp->icmp_ip, msrc->m_data, s_ip_len); /* report the ip packet */ + memcpy(&icp->icmp_ip, msrc->m_hdr.mh_data, s_ip_len); /* report the ip packet */ HTONS(icp->icmp_ip.ip_len); HTONS(icp->icmp_ip.ip_id); HTONS(icp->icmp_ip.ip_off); @@ -320,21 +320,21 @@ icmp_error(struct mbuf *msrc, u_char type, u_char code, int minsize, char *cpnt; message_len=strlen(message); if(message_len>ICMP_MAXDATALEN) message_len=ICMP_MAXDATALEN; - cpnt=(char *)m->m_data+m->m_len; + cpnt=(char *)m->m_hdr.mh_data+m->m_hdr.mh_len; memcpy(cpnt, message, message_len); - m->m_len+=message_len; + m->m_hdr.mh_len+=message_len; } #endif icp->icmp_cksum = 0; - icp->icmp_cksum = cksum(m, m->m_len); + icp->icmp_cksum = cksum(m, m->m_hdr.mh_len); - m->m_data -= hlen; - m->m_len += hlen; + m->m_hdr.mh_data -= hlen; + m->m_hdr.mh_len += hlen; /* fill in ip */ ip->ip_hl = hlen >> 2; - ip->ip_len = m->m_len; + ip->ip_len = m->m_hdr.mh_len; ip->ip_tos=((ip->ip_tos & 0x1E) | 0xC0); /* high priority for errors */ @@ -365,16 +365,16 @@ icmp_reflect(struct mbuf *m) * Send an icmp packet back to the ip level, * after supplying a checksum. */ - m->m_data += hlen; - m->m_len -= hlen; + m->m_hdr.mh_data += hlen; + m->m_hdr.mh_len -= hlen; icp = mtod(m, struct icmp *); icp->icmp_type = ICMP_ECHOREPLY; icp->icmp_cksum = 0; icp->icmp_cksum = cksum(m, ip->ip_len - hlen); - m->m_data -= hlen; - m->m_len += hlen; + m->m_hdr.mh_data -= hlen; + m->m_hdr.mh_len += hlen; /* fill in ip */ if (optlen > 0) { @@ -383,11 +383,11 @@ icmp_reflect(struct mbuf *m) * mbuf's data back, and adjust the IP length. */ memmove((caddr_t)(ip + 1), (caddr_t)ip + hlen, - (unsigned )(m->m_len - hlen)); + (unsigned )(m->m_hdr.mh_len - hlen)); hlen -= optlen; ip->ip_hl = hlen >> 2; ip->ip_len -= optlen; - m->m_len -= optlen; + m->m_hdr.mh_len -= optlen; } ip->ip_ttl = MAXTTL; @@ -410,16 +410,16 @@ void icmp_receive(struct socket *so) struct icmp *icp; int id, len; - m->m_data += hlen; - m->m_len -= hlen; + m->m_hdr.mh_data += hlen; + m->m_hdr.mh_len -= hlen; icp = mtod(m, struct icmp *); id = icp->icmp_id; - len = qemu_recv(so->s, icp, m->m_len, 0); + len = qemu_recv(so->s, icp, m->m_hdr.mh_len, 0); icp->icmp_id = id; - m->m_data -= hlen; - m->m_len += hlen; + m->m_hdr.mh_data -= hlen; + m->m_hdr.mh_len += hlen; if (len == -1 || len == 0) { if (errno == ENETUNREACH) { diff --git a/slirp/ip_input.c b/slirp/ip_input.c index c7b3eb4..046e468 100644 --- a/slirp/ip_input.c +++ b/slirp/ip_input.c @@ -74,9 +74,9 @@ ip_input(struct mbuf *m) DEBUG_CALL("ip_input"); DEBUG_ARG("m = %lx", (long)m); - DEBUG_ARG("m_len = %d", m->m_len); + DEBUG_ARG("m_hdr.mh_len = %d", m->m_hdr.mh_len); - if (m->m_len < sizeof (struct ip)) { + if (m->m_hdr.mh_len < sizeof (struct ip)) { return; } @@ -87,7 +87,7 @@ ip_input(struct mbuf *m) } hlen = ip->ip_hl << 2; - if (hlenm->m_len) {/* min header length */ + if (hlenm->m_hdr.mh_len) {/* min header length */ goto bad; /* or packet too short */ } @@ -115,13 +115,13 @@ ip_input(struct mbuf *m) * Trim mbufs if longer than we expect. * Drop packet if shorter than we expect. */ - if (m->m_len < ip->ip_len) { + if (m->m_hdr.mh_len < ip->ip_len) { goto bad; } /* Should drop packet if mbuf too long? hmmm... */ - if (m->m_len > ip->ip_len) - m_adj(m, ip->ip_len - m->m_len); + if (m->m_hdr.mh_len > ip->ip_len) + m_adj(m, ip->ip_len - m->m_hdr.mh_len); /* check ip_ttl for a correct ICMP reply */ if(ip->ip_ttl==0) { @@ -233,10 +233,10 @@ ip_reass(Slirp *slirp, struct ip *ip, struct ipq *fp) /* * Presence of header sizes in mbufs * would confuse code below. - * Fragment m_data is concatenated. + * Fragment m_hdr.mh_data is concatenated. */ - m->m_data += hlen; - m->m_len -= hlen; + m->m_hdr.mh_data += hlen; + m->m_hdr.mh_len -= hlen; /* * If first fragment to arrive, create a reassembly queue. @@ -342,13 +342,13 @@ insert: /* * If the fragments concatenated to an mbuf that's * bigger than the total size of the fragment, then and - * m_ext buffer was alloced. But fp->ipq_next points to + * M_dat.m_ext_ buffer was alloced. But fp->ipq_next points to * the old buffer (in the mbuf), so we must point ip * into the new buffer. */ - if (m->m_flags & M_EXT) { - int delta = (char *)q - m->m_dat; - q = (struct ipasfrag *)(m->m_ext + delta); + if (m->m_hdr.mh_flags & M_EXT) { + int delta = (char *)q - m->M_dat.m_dat_; + q = (struct ipasfrag *)(m->M_dat.m_ext_ + delta); } ip = fragtoip(q); @@ -358,8 +358,8 @@ insert: ip->ip_dst = fp->ipq_dst; remque(&fp->ip_link); (void) m_free(dtom(slirp, fp)); - m->m_len += (ip->ip_hl << 2); - m->m_data -= (ip->ip_hl << 2); + m->m_hdr.mh_len += (ip->ip_hl << 2); + m->m_hdr.mh_data -= (ip->ip_hl << 2); return ip; @@ -654,9 +654,9 @@ ip_stripoptions(register struct mbuf *m, struct mbuf *mopt) olen = (ip->ip_hl<<2) - sizeof (struct ip); opts = (caddr_t)(ip + 1); - i = m->m_len - (sizeof (struct ip) + olen); + i = m->m_hdr.mh_len - (sizeof (struct ip) + olen); memcpy(opts, opts + olen, (unsigned)i); - m->m_len -= olen; + m->m_hdr.mh_len -= olen; ip->ip_hl = sizeof(struct ip) >> 2; } diff --git a/slirp/ip_output.c b/slirp/ip_output.c index c82830f..5f41c7a 100644 --- a/slirp/ip_output.c +++ b/slirp/ip_output.c @@ -102,7 +102,7 @@ ip_output(struct socket *so, struct mbuf *m0) { int mhlen, firstlen = len; - struct mbuf **mnext = &m->m_nextpkt; + struct mbuf **mnext = &m->m_hdr.mh_nextpkt; /* * Loop through length of segment after first fragment, @@ -117,11 +117,11 @@ ip_output(struct socket *so, struct mbuf *m0) error = -1; goto sendorfree; } - m->m_data += IF_MAXLINKHDR; + m->m_hdr.mh_data += IF_MAXLINKHDR; mhip = mtod(m, struct ip *); *mhip = *ip; - m->m_len = mhlen; + m->m_hdr.mh_len = mhlen; mhip->ip_off = ((off - hlen) >> 3) + (ip->ip_off & ~IP_MF); if (ip->ip_off & IP_MF) mhip->ip_off |= IP_MF; @@ -140,7 +140,7 @@ ip_output(struct socket *so, struct mbuf *m0) mhip->ip_sum = 0; mhip->ip_sum = cksum(m, mhlen); *mnext = m; - mnext = &m->m_nextpkt; + mnext = &m->m_hdr.mh_nextpkt; } /* * Update first fragment by trimming what's been copied out @@ -148,14 +148,14 @@ ip_output(struct socket *so, struct mbuf *m0) */ m = m0; m_adj(m, hlen + firstlen - (uint16_t)ip->ip_len); - ip->ip_len = htons((uint16_t)m->m_len); + ip->ip_len = htons((uint16_t)m->m_hdr.mh_len); ip->ip_off = htons((uint16_t)(ip->ip_off | IP_MF)); ip->ip_sum = 0; ip->ip_sum = cksum(m, hlen); sendorfree: for (m = m0; m; m = m0) { - m0 = m->m_nextpkt; - m->m_nextpkt = NULL; + m0 = m->m_hdr.mh_nextpkt; + m->m_hdr.mh_nextpkt = NULL; if (error == 0) if_output(so, m); else diff --git a/slirp/mbuf.c b/slirp/mbuf.c index c699c75..beb7ffe 100644 --- a/slirp/mbuf.c +++ b/slirp/mbuf.c @@ -11,7 +11,7 @@ * so that one whole packet can fit. Mbuf's cannot be * chained together. If there's more data than the mbuf * could hold, an external malloced buffer is pointed to - * by m_ext (and the data pointers) and M_EXT is set in + * by M_dat.m_ext_ (and the data pointers) and M_EXT is set in * the flags */ @@ -23,13 +23,13 @@ * Find a nice value for msize * XXX if_maxlinkhdr already in mtu */ -#define SLIRP_MSIZE (IF_MTU + IF_MAXLINKHDR + offsetof(struct mbuf, m_dat) + 6) +#define SLIRP_MSIZE (IF_MTU + IF_MAXLINKHDR + offsetof(struct mbuf, M_dat.m_dat_) + 6) 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.m_hdr.mh_next = slirp->m_freelist.m_hdr.mh_prev = &slirp->m_freelist; + slirp->m_usedlist.m_hdr.mh_next = slirp->m_usedlist.m_hdr.mh_prev = &slirp->m_usedlist; } /* @@ -48,7 +48,7 @@ m_get(Slirp *slirp) DEBUG_CALL("m_get"); - if (slirp->m_freelist.m_next == &slirp->m_freelist) { + if (slirp->m_freelist.m_hdr.mh_next == &slirp->m_freelist) { m = (struct mbuf *)malloc(SLIRP_MSIZE); if (m == NULL) goto end_error; slirp->mbuf_alloced++; @@ -56,20 +56,20 @@ m_get(Slirp *slirp) flags = M_DOFREE; m->slirp = slirp; } else { - m = slirp->m_freelist.m_next; + m = slirp->m_freelist.m_hdr.mh_next; remque(m); } /* Insert it in the used list */ insque(m,&slirp->m_usedlist); - m->m_flags = (flags | M_USEDLIST); + m->m_hdr.mh_flags = (flags | M_USEDLIST); /* Initialise it */ - m->m_size = SLIRP_MSIZE - offsetof(struct mbuf, m_dat); - m->m_data = m->m_dat; - m->m_len = 0; - m->m_nextpkt = NULL; - m->m_prevpkt = NULL; + m->m_hdr.mh_size = SLIRP_MSIZE - offsetof(struct mbuf, M_dat.m_dat_); + m->m_hdr.mh_data = m->M_dat.m_dat_; + m->m_hdr.mh_len = 0; + m->m_hdr.mh_nextpkt = NULL; + m->m_hdr.mh_prevpkt = NULL; m->arp_requested = false; m->expiration_date = (uint64_t)-1; end_error: @@ -86,22 +86,22 @@ m_free(struct mbuf *m) if(m) { /* Remove from m_usedlist */ - if (m->m_flags & M_USEDLIST) + if (m->m_hdr.mh_flags & M_USEDLIST) remque(m); /* If it's M_EXT, free() it */ - if (m->m_flags & M_EXT) - free(m->m_ext); + if (m->m_hdr.mh_flags & M_EXT) + free(m->M_dat.m_ext_); /* * Either free() it or put it on the free list */ - if (m->m_flags & M_DOFREE) { + if (m->m_hdr.mh_flags & M_DOFREE) { m->slirp->mbuf_alloced--; free(m); - } else if ((m->m_flags & M_FREELIST) == 0) { + } else if ((m->m_hdr.mh_flags & M_FREELIST) == 0) { insque(m,&m->slirp->m_freelist); - m->m_flags = M_FREELIST; /* Clobber other flags */ + m->m_hdr.mh_flags = M_FREELIST; /* Clobber other flags */ } } /* if(m) */ } @@ -117,11 +117,11 @@ m_cat(struct mbuf *m, struct mbuf *n) /* * If there's no room, realloc */ - if (M_FREEROOM(m) < n->m_len) - m_inc(m,m->m_size+MINCSIZE); + if (M_FREEROOM(m) < n->m_hdr.mh_len) + m_inc(m,m->m_hdr.mh_size+MINCSIZE); - memcpy(m->m_data+m->m_len, n->m_data, n->m_len); - m->m_len += n->m_len; + memcpy(m->m_hdr.mh_data+m->m_hdr.mh_len, n->m_hdr.mh_data, n->m_hdr.mh_len); + m->m_hdr.mh_len += n->m_hdr.mh_len; m_free(n); } @@ -134,24 +134,24 @@ m_inc(struct mbuf *m, int size) int datasize; /* some compiles throw up on gotos. This one we can fake. */ - if(m->m_size>size) return; + if(m->m_hdr.mh_size>size) return; - if (m->m_flags & M_EXT) { - datasize = m->m_data - m->m_ext; - m->m_ext = (char *)realloc(m->m_ext,size); - m->m_data = m->m_ext + datasize; + if (m->m_hdr.mh_flags & M_EXT) { + datasize = m->m_hdr.mh_data - m->M_dat.m_ext_; + m->M_dat.m_ext_ = (char *)realloc(m->M_dat.m_ext_,size); + m->m_hdr.mh_data = m->M_dat.m_ext_ + datasize; } else { char *dat; - datasize = m->m_data - m->m_dat; + datasize = m->m_hdr.mh_data - m->M_dat.m_dat_; dat = (char *)malloc(size); - memcpy(dat, m->m_dat, m->m_size); + memcpy(dat, m->M_dat.m_dat_, m->m_hdr.mh_size); - m->m_ext = dat; - m->m_data = m->m_ext + datasize; - m->m_flags |= M_EXT; + m->M_dat.m_ext_ = dat; + m->m_hdr.mh_data = m->M_dat.m_ext_ + datasize; + m->m_hdr.mh_flags |= M_EXT; } - m->m_size = size; + m->m_hdr.mh_size = size; } @@ -164,12 +164,12 @@ m_adj(struct mbuf *m, int len) return; if (len >= 0) { /* Trim from head */ - m->m_data += len; - m->m_len -= len; + m->m_hdr.mh_data += len; + m->m_hdr.mh_len -= len; } else { /* Trim from tail */ len = -len; - m->m_len -= len; + m->m_hdr.mh_len -= len; } } @@ -183,8 +183,8 @@ m_copy(struct mbuf *n, struct mbuf *m, int off, int len) if (len > M_FREEROOM(n)) return -1; - memcpy((n->m_data + n->m_len), (m->m_data + off), len); - n->m_len += len; + memcpy((n->m_hdr.mh_data + n->m_hdr.mh_len), (m->m_hdr.mh_data + off), len); + n->m_hdr.mh_len += len; return 0; } @@ -203,13 +203,13 @@ dtom(Slirp *slirp, void *dat) DEBUG_ARG("dat = %lx", (long )dat); /* bug corrected for M_EXT buffers */ - for (m = slirp->m_usedlist.m_next; 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) ) + for (m = slirp->m_usedlist.m_hdr.mh_next; m != &slirp->m_usedlist; + m = m->m_hdr.mh_next) { + if (m->m_hdr.mh_flags & M_EXT) { + if( (char *)dat>=m->M_dat.m_ext_ && (char *)dat<(m->M_dat.m_ext_ + m->m_hdr.mh_size) ) return m; } else { - if( (char *)dat >= m->m_dat && (char *)dat<(m->m_dat + m->m_size) ) + if( (char *)dat >= m->M_dat.m_dat_ && (char *)dat<(m->M_dat.m_dat_ + m->m_hdr.mh_size) ) return m; } } diff --git a/slirp/mbuf.h b/slirp/mbuf.h index 0708840..292cbb3 100644 --- a/slirp/mbuf.h +++ b/slirp/mbuf.h @@ -39,14 +39,14 @@ * Macros for type conversion * mtod(m,t) - convert mbuf pointer to data pointer of correct type */ -#define mtod(m,t) ((t)(m)->m_data) +#define mtod(m,t) ((t)(m)->m_hdr.mh_data) /* XXX About mbufs for slirp: * Only one mbuf is ever used in a chain, for each "cell" of data. - * m_nextpkt points to the next packet, if fragmented. + * m_hdr.mh_nextpkt points to the next packet, if fragmented. * If the data is too large, the M_EXT is used, and a larger block * is alloced. Therefore, m_free[m] must check for M_EXT and if set - * free the m_ext. This is inefficient memory-wise, but who cares. + * free the M_dat.m_ext_. This is inefficient memory-wise, but who cares. */ /* XXX should union some of these! */ @@ -66,17 +66,17 @@ struct m_hdr { }; /* - * How much room is in the mbuf, from m_data to the end of the mbuf + * How much room is in the mbuf, from m_hdr.mh_data to the end of the mbuf */ -#define M_ROOM(m) ((m->m_flags & M_EXT)? \ - (((m)->m_ext + (m)->m_size) - (m)->m_data) \ +#define M_ROOM(m) ((m->m_hdr.mh_flags & M_EXT)? \ + (((m)->M_dat.m_ext_ + (m)->m_hdr.mh_size) - (m)->m_hdr.mh_data) \ : \ - (((m)->m_dat + (m)->m_size) - (m)->m_data)) + (((m)->M_dat.m_dat_ + (m)->m_hdr.mh_size) - (m)->m_hdr.mh_data)) /* * How much free room there is */ -#define M_FREEROOM(m) (M_ROOM(m) - (m)->m_len) +#define M_FREEROOM(m) (M_ROOM(m) - (m)->m_hdr.mh_len) #define M_TRAILINGSPACE M_FREEROOM struct mbuf { @@ -91,25 +91,7 @@ struct mbuf { } M_dat; }; -#define m_next m_hdr.mh_next -#define m_prev m_hdr.mh_prev -#define m_nextpkt m_hdr.mh_nextpkt -#define m_prevpkt m_hdr.mh_prevpkt -#define m_flags m_hdr.mh_flags -#define m_len m_hdr.mh_len -#define m_data m_hdr.mh_data -#define m_size m_hdr.mh_size -#define m_dat M_dat.m_dat_ -#define m_ext M_dat.m_ext_ -#define m_so m_hdr.mh_so - -#define ifq_prev m_prev -#define ifq_next m_next -#define ifs_prev m_prevpkt -#define ifs_next m_nextpkt -#define ifq_so m_so - -#define M_EXT 0x01 /* m_ext points to more (malloced) data */ +#define M_EXT 0x01 /* M_dat.m_ext_ points to more (malloced) data */ #define M_FREELIST 0x02 /* mbuf is on free list */ #define M_USEDLIST 0x04 /* XXX mbuf is on used list (for dtom()) */ #define M_DOFREE 0x08 /* when m_free is called on the mbuf, free() diff --git a/slirp/sbuf.c b/slirp/sbuf.c index 5a1ccbf..182e643 100644 --- a/slirp/sbuf.c +++ b/slirp/sbuf.c @@ -68,10 +68,10 @@ sbappend(struct socket *so, struct mbuf *m) DEBUG_CALL("sbappend"); DEBUG_ARG("so = %lx", (long)so); DEBUG_ARG("m = %lx", (long)m); - DEBUG_ARG("m->m_len = %d", m->m_len); + DEBUG_ARG("m->m_hdr.mh_len = %d", m->m_hdr.mh_len); /* Shouldn't happen, but... e.g. foreign host closes connection */ - if (m->m_len <= 0) { + if (m->m_hdr.mh_len <= 0) { m_free(m); return; } @@ -93,7 +93,7 @@ sbappend(struct socket *so, struct mbuf *m) * ottherwise it'll arrive out of order, and hence corrupt */ if (!so->so_rcv.sb_cc) - ret = slirp_send(so, m->m_data, m->m_len, 0); + ret = slirp_send(so, m->m_hdr.mh_data, m->m_hdr.mh_len, 0); if (ret <= 0) { /* @@ -103,13 +103,13 @@ sbappend(struct socket *so, struct mbuf *m) * it will be detected in the normal way by soread() */ sbappendsb(&so->so_rcv, m); - } else if (ret != m->m_len) { + } else if (ret != m->m_hdr.mh_len) { /* * Something was written, but not everything.. * sbappendsb the rest */ - m->m_len -= ret; - m->m_data += ret; + m->m_hdr.mh_len -= ret; + m->m_hdr.mh_data += ret; sbappendsb(&so->so_rcv, m); } /* else */ /* Whatever happened, we free the mbuf */ @@ -125,23 +125,23 @@ sbappendsb(struct sbuf *sb, struct mbuf *m) { int len, n, nn; - len = m->m_len; + len = m->m_hdr.mh_len; if (sb->sb_wptr < sb->sb_rptr) { n = sb->sb_rptr - sb->sb_wptr; if (n > len) n = len; - memcpy(sb->sb_wptr, m->m_data, n); + memcpy(sb->sb_wptr, m->m_hdr.mh_data, n); } else { /* Do the right edge first */ n = sb->sb_data + sb->sb_datalen - sb->sb_wptr; if (n > len) n = len; - memcpy(sb->sb_wptr, m->m_data, n); + memcpy(sb->sb_wptr, m->m_hdr.mh_data, n); len -= n; if (len) { /* Now the left edge */ nn = sb->sb_rptr - sb->sb_data; if (nn > len) nn = len; - memcpy(sb->sb_data,m->m_data+n,nn); + memcpy(sb->sb_data,m->m_hdr.mh_data+n,nn); n += nn; } } diff --git a/slirp/slirp.c b/slirp/slirp.c index 19d69eb..b33211c 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -679,11 +679,11 @@ void slirp_input(Slirp *slirp, const uint8_t *pkt, int pkt_len) if (M_FREEROOM(m) < pkt_len + 2) { m_inc(m, pkt_len + 2); } - m->m_len = pkt_len + 2; - memcpy(m->m_data + 2, pkt, pkt_len); + m->m_hdr.mh_len = pkt_len + 2; + memcpy(m->m_hdr.mh_data + 2, pkt, pkt_len); - m->m_data += 2 + ETH_HLEN; - m->m_len -= 2 + ETH_HLEN; + m->m_hdr.mh_data += 2 + ETH_HLEN; + m->m_hdr.mh_len -= 2 + ETH_HLEN; ip_input(m); break; @@ -700,9 +700,9 @@ int if_encap(Slirp *slirp, struct mbuf *ifm) uint8_t buf[1600]; struct ethhdr *eh = (struct ethhdr *)buf; uint8_t ethaddr[ETH_ALEN]; - const struct ip *iph = (const struct ip *)ifm->m_data; + const struct ip *iph = (const struct ip *)ifm->m_hdr.mh_data; - if (ifm->m_len + ETH_HLEN > sizeof(buf)) { + if (ifm->m_hdr.mh_len + ETH_HLEN > sizeof(buf)) { return 1; } @@ -749,8 +749,8 @@ int if_encap(Slirp *slirp, struct mbuf *ifm) /* XXX: not correct */ memcpy(&eh->h_source[2], &slirp->vhost_addr, 4); eh->h_proto = htons(ETH_P_IP); - memcpy(buf + sizeof(struct ethhdr), ifm->m_data, ifm->m_len); - slirp_output(slirp->opaque, buf, ifm->m_len + ETH_HLEN); + memcpy(buf + sizeof(struct ethhdr), ifm->m_hdr.mh_data, ifm->m_hdr.mh_len); + slirp_output(slirp->opaque, buf, ifm->m_hdr.mh_len + ETH_HLEN); return 1; } } diff --git a/slirp/socket.c b/slirp/socket.c index 77b0c98..f59c403 100644 --- a/slirp/socket.c +++ b/slirp/socket.c @@ -478,7 +478,7 @@ sorecvfrom(struct socket *so) if (!m) { return; } - m->m_data += IF_MAXLINKHDR; + m->m_hdr.mh_data += IF_MAXLINKHDR; /* * XXX Shouldn't FIONREAD packets destined for port 53, @@ -489,17 +489,17 @@ sorecvfrom(struct socket *so) ioctlsocket(so->s, FIONREAD, &n); if (n > len) { - n = (m->m_data - m->m_dat) + m->m_len + n + 1; + n = (m->m_hdr.mh_data - m->M_dat.m_dat_) + m->m_hdr.mh_len + n + 1; m_inc(m, n); len = M_FREEROOM(m); } /* } */ - m->m_len = recvfrom(so->s, m->m_data, len, 0, + m->m_hdr.mh_len = recvfrom(so->s, m->m_hdr.mh_data, len, 0, (struct sockaddr *)&addr, &addrlen); DEBUG_MISC((dfd, " did recvfrom %d, errno = %d-%s\n", - m->m_len, errno,strerror(errno))); - if(m->m_len<0) { + m->m_hdr.mh_len, errno,strerror(errno))); + if(m->m_hdr.mh_len<0) { u_char code=ICMP_UNREACH_PORT; if(errno == EHOSTUNREACH) code=ICMP_UNREACH_HOST; @@ -562,7 +562,7 @@ sosendto(struct socket *so, struct mbuf *m) DEBUG_MISC((dfd, " sendto()ing, addr.sin_port=%d, addr.sin_addr.s_addr=%.16s\n", ntohs(addr.sin_port), inet_ntoa(addr.sin_addr))); /* Don't care what port we get */ - ret = sendto(so->s, m->m_data, m->m_len, 0, + ret = sendto(so->s, m->m_hdr.mh_data, m->m_hdr.mh_len, 0, (struct sockaddr *)&addr, sizeof (struct sockaddr)); if (ret < 0) return -1; diff --git a/slirp/tcp_input.c b/slirp/tcp_input.c index 942aaf4..f740978 100644 --- a/slirp/tcp_input.c +++ b/slirp/tcp_input.c @@ -313,8 +313,8 @@ tcp_input(struct mbuf *m, int iphlen, struct socket *inso) /* * Drop TCP, IP headers and TCP options. */ - m->m_data += sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr); - m->m_len -= sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr); + m->m_hdr.mh_data += sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr); + m->m_hdr.mh_len -= sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr); if (slirp->restricted) { for (ex_ptr = slirp->exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next) { @@ -592,8 +592,8 @@ findso: HTONL(ti->ti_ack); HTONS(ti->ti_win); HTONS(ti->ti_urp); - m->m_data -= sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr); - m->m_len += sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr); + m->m_hdr.mh_data -= sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr); + m->m_hdr.mh_len += sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr); *ip=save_ip; icmp_error(m, ICMP_UNREACH,code, 0,strerror(errno)); } @@ -1342,18 +1342,18 @@ tcp_pulloutofband(so, ti, m) int cnt = ti->ti_urp - 1; while (cnt >= 0) { - if (m->m_len > cnt) { + if (m->m_hdr.mh_len > cnt) { char *cp = mtod(m, caddr_t) + cnt; struct tcpcb *tp = sototcpcb(so); tp->t_iobc = *cp; tp->t_oobflags |= TCPOOB_HAVEDATA; - memcpy(sp, cp+1, (unsigned)(m->m_len - cnt - 1)); - m->m_len--; + memcpy(sp, cp+1, (unsigned)(m->m_hdr.mh_len - cnt - 1)); + m->m_hdr.mh_len--; return; } - cnt -= m->m_len; - m = m->m_next; /* XXX WRONG! Fix it! */ + cnt -= m->m_hdr.mh_len; + m = m->m_hdr.mh_next; /* XXX WRONG! Fix it! */ if (m == 0) break; } diff --git a/slirp/tcp_output.c b/slirp/tcp_output.c index 779314b..269b642 100644 --- a/slirp/tcp_output.c +++ b/slirp/tcp_output.c @@ -295,11 +295,11 @@ send: error = 1; goto out; } - m->m_data += IF_MAXLINKHDR; - m->m_len = hdrlen; + m->m_hdr.mh_data += IF_MAXLINKHDR; + m->m_hdr.mh_len = hdrlen; sbcopy(&so->so_snd, off, (int) len, mtod(m, caddr_t) + hdrlen); - m->m_len += len; + m->m_hdr.mh_len += len; /* * If we're sending everything we've got, set PUSH. @@ -315,8 +315,8 @@ send: error = 1; goto out; } - m->m_data += IF_MAXLINKHDR; - m->m_len = hdrlen; + m->m_hdr.mh_data += IF_MAXLINKHDR; + m->m_hdr.mh_len = hdrlen; } ti = mtod(m, struct tcpiphdr *); @@ -444,11 +444,11 @@ send: * to handle ttl and tos; we could keep them in * the template, but need a way to checksum without them. */ - m->m_len = hdrlen + len; /* XXX Needed? m_len should be correct */ + m->m_hdr.mh_len = hdrlen + len; /* XXX Needed? m_hdr.mh_len should be correct */ { - ((struct ip *)ti)->ip_len = m->m_len; + ((struct ip *)ti)->ip_len = m->m_hdr.mh_len; ((struct ip *)ti)->ip_ttl = IPDEFTTL; ((struct ip *)ti)->ip_tos = so->so_iptos; diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c index 143a238..bf52689 100644 --- a/slirp/tcp_subr.c +++ b/slirp/tcp_subr.c @@ -120,7 +120,7 @@ tcp_respond(struct tcpcb *tp, struct tcpiphdr *ti, struct mbuf *m, if ((m = m_get(tp->t_socket->slirp)) == NULL) return; tlen = 0; - m->m_data += IF_MAXLINKHDR; + m->m_hdr.mh_data += IF_MAXLINKHDR; *mtod(m, struct tcpiphdr *) = *ti; ti = mtod(m, struct tcpiphdr *); flags = TH_ACK; @@ -129,9 +129,9 @@ tcp_respond(struct tcpcb *tp, struct tcpiphdr *ti, struct mbuf *m, * ti points into m so the next line is just making * the mbuf point to ti */ - m->m_data = (caddr_t)ti; + m->m_hdr.mh_data = (caddr_t)ti; - m->m_len = sizeof (struct tcpiphdr); + m->m_hdr.mh_len = sizeof (struct tcpiphdr); tlen = 0; #define xchg(a,b,type) { type t; t=a; a=b; b=t; } xchg(ti->ti_dst.s_addr, ti->ti_src.s_addr, uint32_t); @@ -140,7 +140,7 @@ tcp_respond(struct tcpcb *tp, struct tcpiphdr *ti, struct mbuf *m, } ti->ti_len = htons((u_short)(sizeof (struct tcphdr) + tlen)); tlen += sizeof (struct tcpiphdr); - m->m_len = tlen; + m->m_hdr.mh_len = tlen; ti->ti_mbuf = NULL; ti->ti_x1 = 0; @@ -570,11 +570,11 @@ tcp_emu(struct socket *so, struct mbuf *m) socklen_t addrlen = sizeof(struct sockaddr_in); struct sbuf *so_rcv = &so->so_rcv; - memcpy(so_rcv->sb_wptr, m->m_data, m->m_len); - so_rcv->sb_wptr += m->m_len; - so_rcv->sb_rptr += m->m_len; - m->m_data[m->m_len] = 0; /* NULL terminate */ - if (strchr(m->m_data, '\r') || strchr(m->m_data, '\n')) { + memcpy(so_rcv->sb_wptr, m->m_hdr.mh_data, m->m_hdr.mh_len); + so_rcv->sb_wptr += m->m_hdr.mh_len; + so_rcv->sb_rptr += m->m_hdr.mh_len; + m->m_hdr.mh_data[m->m_hdr.mh_len] = 0; /* NULL terminate */ + if (strchr(m->m_hdr.mh_data, '\r') || strchr(m->m_hdr.mh_data, '\n')) { if (sscanf(so_rcv->sb_data, "%u%*[ ,]%u", &n1, &n2) == 2) { HTONS(n1); HTONS(n2); @@ -604,8 +604,8 @@ tcp_emu(struct socket *so, struct mbuf *m) } case EMU_FTP: /* ftp */ - *(m->m_data+m->m_len) = 0; /* NUL terminate for strstr */ - if ((bptr = (char *)strstr(m->m_data, "ORT")) != NULL) { + *(m->m_hdr.mh_data+m->m_hdr.mh_len) = 0; /* NUL terminate for strstr */ + if ((bptr = (char *)strstr(m->m_hdr.mh_data, "ORT")) != NULL) { /* * Need to emulate the PORT command */ @@ -633,12 +633,12 @@ tcp_emu(struct socket *so, struct mbuf *m) n3 = ((laddr >> 8) & 0xff); n4 = (laddr & 0xff); - m->m_len = bptr - m->m_data; /* Adjust length */ - m->m_len += snprintf(bptr, m->m_hdr.mh_size - m->m_len, + m->m_hdr.mh_len = bptr - m->m_hdr.mh_data; /* Adjust length */ + m->m_hdr.mh_len += snprintf(bptr, m->m_hdr.mh_size - m->m_hdr.mh_len, "ORT %d,%d,%d,%d,%d,%d\r\n%s", n1, n2, n3, n4, n5, n6, x==7?buff:""); return 1; - } else if ((bptr = (char *)strstr(m->m_data, "27 Entering")) != NULL) { + } else if ((bptr = (char *)strstr(m->m_hdr.mh_data, "27 Entering")) != NULL) { /* * Need to emulate the PASV response */ @@ -666,8 +666,8 @@ tcp_emu(struct socket *so, struct mbuf *m) n3 = ((laddr >> 8) & 0xff); n4 = (laddr & 0xff); - m->m_len = bptr - m->m_data; /* Adjust length */ - m->m_len += snprintf(bptr, m->m_hdr.mh_size - m->m_len, + m->m_hdr.mh_len = bptr - m->m_hdr.mh_data; /* Adjust length */ + m->m_hdr.mh_len += snprintf(bptr, m->m_hdr.mh_size - m->m_hdr.mh_len, "27 Entering Passive Mode (%d,%d,%d,%d,%d,%d)\r\n%s", n1, n2, n3, n4, n5, n6, x==7?buff:""); @@ -684,16 +684,16 @@ tcp_emu(struct socket *so, struct mbuf *m) * of the connection as a NUL-terminated decimal ASCII string. */ so->so_emu = 0; - for (lport = 0, i = 0; i < m->m_len-1; ++i) { - if (m->m_data[i] < '0' || m->m_data[i] > '9') + for (lport = 0, i = 0; i < m->m_hdr.mh_len-1; ++i) { + if (m->m_hdr.mh_data[i] < '0' || m->m_hdr.mh_data[i] > '9') return 1; /* invalid number */ lport *= 10; - lport += m->m_data[i] - '0'; + lport += m->m_hdr.mh_data[i] - '0'; } - if (m->m_data[m->m_len-1] == '\0' && lport != 0 && + if (m->m_hdr.mh_data[m->m_hdr.mh_len-1] == '\0' && lport != 0 && (so = tcp_listen(slirp, INADDR_ANY, 0, so->so_laddr.s_addr, htons(lport), SS_FACCEPTONCE)) != NULL) - m->m_len = snprintf(m->m_data, m->m_hdr.mh_size, "%d", + m->m_hdr.mh_len = snprintf(m->m_hdr.mh_data, m->m_hdr.mh_size, "%d", ntohs(so->so_fport)) + 1; return 1; @@ -701,8 +701,8 @@ tcp_emu(struct socket *so, struct mbuf *m) /* * Need to emulate DCC CHAT, DCC SEND and DCC MOVE */ - *(m->m_data+m->m_len) = 0; /* NULL terminate the string for strstr */ - if ((bptr = (char *)strstr(m->m_data, "DCC")) == NULL) + *(m->m_hdr.mh_data+m->m_hdr.mh_len) = 0; /* NULL terminate the string for strstr */ + if ((bptr = (char *)strstr(m->m_hdr.mh_data, "DCC")) == NULL) return 1; /* The %256s is for the broken mIRC */ @@ -712,8 +712,8 @@ tcp_emu(struct socket *so, struct mbuf *m) SS_FACCEPTONCE)) == NULL) { return 1; } - m->m_len = bptr - m->m_data; /* Adjust length */ - m->m_len += snprintf(bptr, m->m_hdr.mh_size, + m->m_hdr.mh_len = bptr - m->m_hdr.mh_data; /* Adjust length */ + m->m_hdr.mh_len += snprintf(bptr, m->m_hdr.mh_size, "DCC CHAT chat %lu %u%c\n", (unsigned long)ntohl(so->so_faddr.s_addr), ntohs(so->so_fport), 1); @@ -723,8 +723,8 @@ tcp_emu(struct socket *so, struct mbuf *m) SS_FACCEPTONCE)) == NULL) { return 1; } - m->m_len = bptr - m->m_data; /* Adjust length */ - m->m_len += snprintf(bptr, m->m_hdr.mh_size, + m->m_hdr.mh_len = bptr - m->m_hdr.mh_data; /* Adjust length */ + m->m_hdr.mh_len += snprintf(bptr, m->m_hdr.mh_size, "DCC SEND %s %lu %u %u%c\n", buff, (unsigned long)ntohl(so->so_faddr.s_addr), ntohs(so->so_fport), n1, 1); @@ -734,8 +734,8 @@ tcp_emu(struct socket *so, struct mbuf *m) SS_FACCEPTONCE)) == NULL) { return 1; } - m->m_len = bptr - m->m_data; /* Adjust length */ - m->m_len += snprintf(bptr, m->m_hdr.mh_size, + m->m_hdr.mh_len = bptr - m->m_hdr.mh_data; /* Adjust length */ + m->m_hdr.mh_len += snprintf(bptr, m->m_hdr.mh_size, "DCC MOVE %s %lu %u %u%c\n", buff, (unsigned long)ntohl(so->so_faddr.s_addr), ntohs(so->so_fport), n1, 1); @@ -779,8 +779,8 @@ tcp_emu(struct socket *so, struct mbuf *m) * us where we're going. */ - bptr = m->m_data; - while (bptr < m->m_data + m->m_len) { + bptr = m->m_hdr.mh_data; + while (bptr < m->m_hdr.mh_data + m->m_hdr.mh_len) { u_short p; static int ra = 0; char ra_tbl[4]; diff --git a/slirp/tftp.c b/slirp/tftp.c index b78765f..5ed5882 100644 --- a/slirp/tftp.c +++ b/slirp/tftp.c @@ -129,11 +129,11 @@ static int tftp_send_oack(struct tftp_session *spt, if (!m) return -1; - memset(m->m_data, 0, m->m_size); + memset(m->m_hdr.mh_data, 0, m->m_hdr.mh_size); - m->m_data += IF_MAXLINKHDR; - tp = (void *)m->m_data; - m->m_data += sizeof(struct udpiphdr); + m->m_hdr.mh_data += IF_MAXLINKHDR; + tp = (void *)m->m_hdr.mh_data; + m->m_hdr.mh_data += sizeof(struct udpiphdr); tp->tp_op = htons(TFTP_OACK); n += snprintf(tp->x.tp_buf + n, sizeof(tp->x.tp_buf) - n, "%s", @@ -147,7 +147,7 @@ static int tftp_send_oack(struct tftp_session *spt, daddr.sin_addr = spt->client_ip; daddr.sin_port = spt->client_port; - m->m_len = sizeof(struct tftp_t) - 514 + n - + m->m_hdr.mh_len = sizeof(struct tftp_t) - 514 + n - sizeof(struct ip) - sizeof(struct udphdr); udp_output2(NULL, m, &saddr, &daddr, IPTOS_LOWDELAY); @@ -168,11 +168,11 @@ static void tftp_send_error(struct tftp_session *spt, goto out; } - memset(m->m_data, 0, m->m_size); + memset(m->m_hdr.mh_data, 0, m->m_hdr.mh_size); - m->m_data += IF_MAXLINKHDR; - tp = (void *)m->m_data; - m->m_data += sizeof(struct udpiphdr); + m->m_hdr.mh_data += IF_MAXLINKHDR; + tp = (void *)m->m_hdr.mh_data; + m->m_hdr.mh_data += sizeof(struct udpiphdr); tp->tp_op = htons(TFTP_ERROR); tp->x.tp_error.tp_error_code = htons(errorcode); @@ -184,7 +184,7 @@ static void tftp_send_error(struct tftp_session *spt, daddr.sin_addr = spt->client_ip; daddr.sin_port = spt->client_port; - m->m_len = sizeof(struct tftp_t) - 514 + 3 + strlen(msg) - + m->m_hdr.mh_len = sizeof(struct tftp_t) - 514 + 3 + strlen(msg) - sizeof(struct ip) - sizeof(struct udphdr); udp_output2(NULL, m, &saddr, &daddr, IPTOS_LOWDELAY); @@ -212,11 +212,11 @@ static int tftp_send_data(struct tftp_session *spt, return -1; } - memset(m->m_data, 0, m->m_size); + memset(m->m_hdr.mh_data, 0, m->m_hdr.mh_size); - m->m_data += IF_MAXLINKHDR; - tp = (void *)m->m_data; - m->m_data += sizeof(struct udpiphdr); + m->m_hdr.mh_data += IF_MAXLINKHDR; + tp = (void *)m->m_hdr.mh_data; + m->m_hdr.mh_data += sizeof(struct udpiphdr); tp->tp_op = htons(TFTP_DATA); tp->x.tp_data.tp_block_nr = htons(block_nr); @@ -239,7 +239,7 @@ static int tftp_send_data(struct tftp_session *spt, return -1; } - m->m_len = sizeof(struct tftp_t) - (512 - nobytes) - + m->m_hdr.mh_len = sizeof(struct tftp_t) - (512 - nobytes) - sizeof(struct ip) - sizeof(struct udphdr); udp_output2(NULL, m, &saddr, &daddr, IPTOS_LOWDELAY); @@ -404,19 +404,19 @@ static void tftp_handle_error(Slirp *slirp, struct tftp_t *tp, int pktlen) void tftp_input(struct mbuf *m) { - struct tftp_t *tp = (struct tftp_t *)m->m_data; + struct tftp_t *tp = (struct tftp_t *)m->m_hdr.mh_data; switch(ntohs(tp->tp_op)) { case TFTP_RRQ: - tftp_handle_rrq(m->slirp, tp, m->m_len); + tftp_handle_rrq(m->slirp, tp, m->m_hdr.mh_len); break; case TFTP_ACK: - tftp_handle_ack(m->slirp, tp, m->m_len); + tftp_handle_ack(m->slirp, tp, m->m_hdr.mh_len); break; case TFTP_ERROR: - tftp_handle_error(m->slirp, tp, m->m_len); + tftp_handle_error(m->slirp, tp, m->m_hdr.mh_len); break; } } diff --git a/slirp/udp.c b/slirp/udp.c index 5b060f3..3035e4f 100644 --- a/slirp/udp.c +++ b/slirp/udp.c @@ -49,8 +49,8 @@ udp_init(Slirp *slirp) slirp->udb.so_next = slirp->udb.so_prev = &slirp->udb; slirp->udp_last_so = &slirp->udb; } -/* m->m_data points at ip packet header - * m->m_len length ip packet +/* m->m_hdr.mh_data points at ip packet header + * m->m_hdr.mh_len length ip packet * ip->ip_len length data (IPDU) */ void @@ -198,15 +198,15 @@ udp_input(register struct mbuf *m, int iphlen) so->so_fport = uh->uh_dport; /* XXX */ iphlen += sizeof(struct udphdr); - m->m_len -= iphlen; - m->m_data += iphlen; + m->m_hdr.mh_len -= iphlen; + m->m_hdr.mh_data += iphlen; /* * Now we sendto() the packet. */ if(sosendto(so,m) == -1) { - m->m_len += iphlen; - m->m_data -= iphlen; + m->m_hdr.mh_len += iphlen; + m->m_hdr.mh_data -= iphlen; *ip=save_ip; DEBUG_MISC((dfd,"udp tx errno = %d-%s\n",errno,strerror(errno))); icmp_error(m, ICMP_UNREACH,ICMP_UNREACH_NET, 0,strerror(errno)); @@ -215,8 +215,8 @@ udp_input(register struct mbuf *m, int iphlen) m_free(so->so_m); /* used for ICMP if error on sorecvfrom */ /* restore the orig mbuf packet */ - m->m_len += iphlen; - m->m_data -= iphlen; + m->m_hdr.mh_len += iphlen; + m->m_hdr.mh_data -= iphlen; *ip=save_ip; so->so_m=m; /* ICMP backup */ @@ -242,8 +242,8 @@ int udp_output2(struct socket *so, struct mbuf *m, /* * Adjust for header */ - m->m_data -= sizeof(struct udpiphdr); - m->m_len += sizeof(struct udpiphdr); + m->m_hdr.mh_data -= sizeof(struct udpiphdr); + m->m_hdr.mh_len += sizeof(struct udpiphdr); /* * Fill in mbuf with extended UDP header @@ -253,7 +253,7 @@ int udp_output2(struct socket *so, struct mbuf *m, memset(&ui->ui_i.ih_mbuf, 0 , sizeof(struct mbuf_ptr)); ui->ui_x1 = 0; ui->ui_pr = IPPROTO_UDP; - ui->ui_len = htons(m->m_len - sizeof(struct ip)); + ui->ui_len = htons(m->m_hdr.mh_len - sizeof(struct ip)); /* XXXXX Check for from-one-location sockets, or from-any-location sockets */ ui->ui_src = saddr->sin_addr; ui->ui_dst = daddr->sin_addr; @@ -265,9 +265,9 @@ int udp_output2(struct socket *so, struct mbuf *m, * Stuff checksum and output datagram. */ ui->ui_sum = 0; - if ((ui->ui_sum = cksum(m, m->m_len)) == 0) + if ((ui->ui_sum = cksum(m, m->m_hdr.mh_len)) == 0) ui->ui_sum = 0xffff; - ((struct ip *)ui)->ip_len = m->m_len; + ((struct ip *)ui)->ip_len = m->m_hdr.mh_len; ((struct ip *)ui)->ip_ttl = IPDEFTTL; ((struct ip *)ui)->ip_tos = iptos;