slirp: improve TFTP performance
When transferring a file, keep it open during the whole transfer, instead of opening/closing it for each block. Signed-off-by: Hervé Poussineau <hpoussin@reactos.org> Reviewed-by: Aurelien Jarno <aurelien@aurel32.net> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
This commit is contained in:
parent
e56afbc54a
commit
78be056628
32
slirp/tftp.c
32
slirp/tftp.c
@ -37,6 +37,10 @@ static inline void tftp_session_update(struct tftp_session *spt)
|
||||
|
||||
static void tftp_session_terminate(struct tftp_session *spt)
|
||||
{
|
||||
if (spt->fd >= 0) {
|
||||
close(spt->fd);
|
||||
spt->fd = -1;
|
||||
}
|
||||
g_free(spt->filename);
|
||||
spt->slirp = NULL;
|
||||
}
|
||||
@ -54,7 +58,7 @@ static int tftp_session_allocate(Slirp *slirp, struct tftp_t *tp)
|
||||
|
||||
/* sessions time out after 5 inactive seconds */
|
||||
if ((int)(curtime - spt->timestamp) > 5000) {
|
||||
g_free(spt->filename);
|
||||
tftp_session_terminate(spt);
|
||||
goto found;
|
||||
}
|
||||
}
|
||||
@ -64,6 +68,7 @@ static int tftp_session_allocate(Slirp *slirp, struct tftp_t *tp)
|
||||
found:
|
||||
memset(spt, 0, sizeof(*spt));
|
||||
memcpy(&spt->client_ip, &tp->ip.ip_src, sizeof(spt->client_ip));
|
||||
spt->fd = -1;
|
||||
spt->client_port = tp->udp.uh_sport;
|
||||
spt->slirp = slirp;
|
||||
|
||||
@ -95,24 +100,23 @@ static int tftp_session_find(Slirp *slirp, struct tftp_t *tp)
|
||||
static int tftp_read_data(struct tftp_session *spt, uint16_t block_nr,
|
||||
uint8_t *buf, int len)
|
||||
{
|
||||
int fd;
|
||||
int bytes_read = 0;
|
||||
int bytes_read = 0;
|
||||
|
||||
fd = open(spt->filename, O_RDONLY | O_BINARY);
|
||||
if (spt->fd < 0) {
|
||||
spt->fd = open(spt->filename, O_RDONLY | O_BINARY);
|
||||
}
|
||||
|
||||
if (fd < 0) {
|
||||
return -1;
|
||||
}
|
||||
if (spt->fd < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (len) {
|
||||
lseek(fd, block_nr * 512, SEEK_SET);
|
||||
if (len) {
|
||||
lseek(spt->fd, block_nr * 512, SEEK_SET);
|
||||
|
||||
bytes_read = read(fd, buf, len);
|
||||
}
|
||||
bytes_read = read(spt->fd, buf, len);
|
||||
}
|
||||
|
||||
close(fd);
|
||||
|
||||
return bytes_read;
|
||||
return bytes_read;
|
||||
}
|
||||
|
||||
static int tftp_send_oack(struct tftp_session *spt,
|
||||
|
@ -33,6 +33,7 @@ struct tftp_t {
|
||||
struct tftp_session {
|
||||
Slirp *slirp;
|
||||
char *filename;
|
||||
int fd;
|
||||
|
||||
struct in_addr client_ip;
|
||||
uint16_t client_port;
|
||||
|
Loading…
Reference in New Issue
Block a user