From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:56844) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Q9ScD-0003QD-3H for qemu-devel@nongnu.org; Mon, 11 Apr 2011 21:42:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Q9MVv-0005rX-UO for qemu-devel@nongnu.org; Mon, 11 Apr 2011 15:11:09 -0400 Received: from smtp5-g21.free.fr ([212.27.42.5]:36362) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Q9MVv-0005qp-DM for qemu-devel@nongnu.org; Mon, 11 Apr 2011 15:11:07 -0400 From: Herve Poussineau Date: Mon, 11 Apr 2011 19:10:53 +0000 Message-Id: <1302549054-2248-3-git-send-email-hpoussin@reactos.org> In-Reply-To: <1302549054-2248-2-git-send-email-hpoussin@reactos.org> References: <1302549054-2248-1-git-send-email-hpoussin@reactos.org> <1302549054-2248-2-git-send-email-hpoussin@reactos.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH 2/3] slirp: Handle more than 65535 blocks in TFTP transfers List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: =?utf-8?q?Herv=E9=20Poussineau?= From: Herv=E9 Poussineau RFC 1350 does not mention block count-roll over. However, a lot of TFTP s= ervers implement it to be able to transmit big files, so do it also Signed-off-by: Herv=E9 Poussineau --- slirp/tftp.c | 9 +++++---- slirp/tftp.h | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/slirp/tftp.c b/slirp/tftp.c index 7ef44c9..7e63269 100644 --- a/slirp/tftp.c +++ b/slirp/tftp.c @@ -92,7 +92,7 @@ static int tftp_session_find(Slirp *slirp, struct tftp_= t *tp) return -1; } =20 -static int tftp_read_data(struct tftp_session *spt, uint16_t block_nr, +static int tftp_read_data(struct tftp_session *spt, uint32_t block_nr, uint8_t *buf, int len) { int fd; @@ -196,7 +196,7 @@ out: } =20 static int tftp_send_data(struct tftp_session *spt, - uint16_t block_nr, + uint32_t block_nr, struct tftp_t *recv_tp) { struct sockaddr_in saddr, daddr; @@ -221,7 +221,7 @@ static int tftp_send_data(struct tftp_session *spt, m->m_data +=3D sizeof(struct udpiphdr); =20 tp->tp_op =3D htons(TFTP_DATA); - tp->x.tp_data.tp_block_nr =3D htons(block_nr); + tp->x.tp_data.tp_block_nr =3D htons(block_nr & 0xffff); =20 saddr.sin_addr =3D recv_tp->ip.ip_dst; saddr.sin_port =3D recv_tp->udp.uh_dport; @@ -253,6 +253,7 @@ static int tftp_send_data(struct tftp_session *spt, tftp_session_terminate(spt); } =20 + spt->block_nr =3D block_nr; return 0; } =20 @@ -407,7 +408,7 @@ static void tftp_handle_ack(Slirp *slirp, struct tftp= _t *tp, int pktlen) } =20 if (tftp_send_data(&slirp->tftp_sessions[s], - ntohs(tp->x.tp_data.tp_block_nr) + 1, + slirp->tftp_sessions[s].block_nr + 1, tp) < 0) { return; } diff --git a/slirp/tftp.h b/slirp/tftp.h index 72e5e91..471f22e 100644 --- a/slirp/tftp.h +++ b/slirp/tftp.h @@ -36,6 +36,7 @@ struct tftp_session { =20 struct in_addr client_ip; uint16_t client_port; + uint32_t block_nr; =20 int timestamp; }; --=20 1.6.0.2.GIT