Skip to content

Commit 1290819

Browse files
committed
Add support for chunking of served files
This removes the limitation that a file served from FLASH memory needs to be smaller than the TCP buffer size. Now we serve up to the TCP buffer size in the first go and then remember what parts still need to be sent. As soon as the previous package has been acked, the next chunk of data is copied from flash into the TCP transmit buffer and gets sent. We take care only to send the current TCP window size so no further fragmentation needs to happen, thus optimizing transmission of the remainder.
1 parent 26741d2 commit 1290819

File tree

1 file changed

+19
-3
lines changed

1 file changed

+19
-3
lines changed

httpd/httpd.c

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ __xdata uint16_t slen;
3333
__xdata uint16_t o_idx;
3434
__xdata uint16_t mpos;
3535
__xdata uint16_t len_left;
36+
__xdata uint16_t cont_len;
37+
__xdata uint32_t cont_addr;
3638

3739
// HTTP header properties
3840
__xdata uint8_t boundary[72];
@@ -386,12 +388,22 @@ void httpd_appcall(void)
386388
if (slen > uip_mss()) {
387389
print_string("Sending A: "); print_short(slen); write_char('\n');
388390
uip_send(outbuf + o_idx, uip_mss());
389-
print_string("Sending A done\n");
390391
s->tstate = TSTATE_TX;
391392
} else if (slen > 0) {
392393
print_string("Sending B: "); print_short(slen); write_char('\n');
393394
uip_send(outbuf + o_idx, slen);
394-
print_string("Sending B done\n");
395+
s->tstate = TSTATE_TX;
396+
} else if (cont_len) {
397+
print_string("CONT cont_len: "); print_short(cont_len);
398+
slen = cont_len > uip_mss() ? uip_mss() : cont_len;
399+
if (slen > TCP_OUTBUF_SIZE)
400+
slen = TCP_OUTBUF_SIZE;
401+
flash_region.addr = cont_addr;
402+
flash_region.len = slen;
403+
flash_read_bulk(outbuf);
404+
uip_send(outbuf, slen);
405+
cont_len -= slen;
406+
cont_addr += slen;
395407
s->tstate = TSTATE_TX;
396408
}
397409
} else if (uip_newdata() && s->tstate == TSTATE_POST) {
@@ -452,7 +464,11 @@ void httpd_appcall(void)
452464
slen += strtox(outbuf + slen, mime_strings[f_data[entry].mime]);
453465
slen += strtox(outbuf + slen, "\r\nCache-Control: max-age=2592000\r\n\r\n");
454466
len_left = f_data[entry].len;
455-
467+
if (len_left > (TCP_OUTBUF_SIZE - slen)) {
468+
cont_len = len_left - (TCP_OUTBUF_SIZE - slen);
469+
len_left = TCP_OUTBUF_SIZE - slen;
470+
cont_addr = f_data[entry].start + len_left;
471+
}
456472
print_string("MIME: "); print_string(mime_strings[f_data[entry].mime]); write_char('\n');
457473
flash_region.addr = f_data[entry].start;
458474
flash_region.len = len_left;

0 commit comments

Comments
 (0)