9
0
Fork 0

fs tftp: Only request a block once

tftp_send is called often. Each time, when in STATE_RDATA, a packet
is requested from the tftp server, even if we requested the same packet
already.
Stop this by tracking which packet we requested.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Sascha Hauer 2012-10-23 10:11:13 +02:00
parent 5e46365808
commit d2606de353
1 changed files with 6 additions and 0 deletions

View File

@ -80,6 +80,7 @@ struct file_priv {
struct kfifo *fifo;
void *buf;
int blocksize;
int block_requested;
};
struct tftp_priv {
@ -152,11 +153,14 @@ static int tftp_send(struct file_priv *priv)
break;
case STATE_RDATA:
if (priv->block == priv->block_requested)
return 0;
case STATE_OACK:
xp = pkt;
s = (uint16_t *)pkt;
*s++ = htons(TFTP_ACK);
*s++ = htons(priv->block);
priv->block_requested = priv->block;
pkt = (unsigned char *)s;
len = pkt - xp;
break;
@ -199,6 +203,7 @@ static int tftp_poll(struct file_priv *priv)
if (is_timeout(priv->resend_timeout, TFTP_RESEND_TIMEOUT)) {
printf("T ");
priv->resend_timeout = get_time_ns();
priv->block_requested = -1;
return TFTP_ERR_RESEND;
}
@ -392,6 +397,7 @@ static struct file_priv *tftp_do_open(struct device_d *dev,
priv->err = -EINVAL;
priv->filename = filename;
priv->blocksize = TFTP_BLOCK_SIZE;
priv->block_requested = -1;
priv->fifo = kfifo_alloc(4096);
if (!priv->fifo) {