diff options
| -rw-r--r-- | extmod/modlwip.c | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/extmod/modlwip.c b/extmod/modlwip.c index d4e25917a..afac512e8 100644 --- a/extmod/modlwip.c +++ b/extmod/modlwip.c @@ -69,6 +69,8 @@ #define IP_ADD_MEMBERSHIP 0x400 #define IP_DROP_MEMBERSHIP 0x401 +#define TCP_NODELAY TF_NODELAY + // For compatibilily with older lwIP versions. #ifndef ip_set_option #define ip_set_option(pcb, opt) ((pcb)->so_options |= (opt)) @@ -76,6 +78,12 @@ #ifndef ip_reset_option #define ip_reset_option(pcb, opt) ((pcb)->so_options &= ~(opt)) #endif +#ifndef tcp_set_flags +#define tcp_set_flags(pcb, set_flags) do { (pcb)->flags |= (set_flags); } while (0) +#endif +#ifndef tcp_clear_flags +#define tcp_clear_flags(pcb, clear_flags) do { (pcb)->flags &= ~(clear_flags); } while (0) +#endif // A port can define these hooks to provide concurrency protection #ifndef MICROPY_PY_LWIP_ENTER @@ -742,9 +750,10 @@ static mp_uint_t lwip_tcp_send(lwip_socket_obj_t *socket, const byte *buf, mp_ui MICROPY_PY_LWIP_REENTER } - // If the output buffer is getting full then send the data to the lower layers - if (err == ERR_OK && tcp_sndbuf(socket->pcb.tcp) < TCP_SND_BUF / 4) { - err = tcp_output(socket->pcb.tcp); + // Use nagle algorithm to determine when to send segment buffer (can be + // disabled with TCP_NODELAY socket option) + if (err == ERR_OK) { + err = tcp_output_nagle(socket->pcb.tcp); } MICROPY_PY_LWIP_EXIT @@ -1440,6 +1449,17 @@ static mp_obj_t lwip_socket_setsockopt(size_t n_args, const mp_obj_t *args) { break; } + // level: IPPROTO_TCP + case TCP_NODELAY: { + mp_int_t val = mp_obj_get_int(args[3]); + if (val) { + tcp_set_flags(socket->pcb.tcp, opt); + } else { + tcp_clear_flags(socket->pcb.tcp, opt); + } + break; + } + default: printf("Warning: lwip.setsockopt() not implemented\n"); } @@ -1829,6 +1849,9 @@ static const mp_rom_map_elem_t mp_module_lwip_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_IPPROTO_IP), MP_ROM_INT(0) }, { MP_ROM_QSTR(MP_QSTR_IP_ADD_MEMBERSHIP), MP_ROM_INT(IP_ADD_MEMBERSHIP) }, { MP_ROM_QSTR(MP_QSTR_IP_DROP_MEMBERSHIP), MP_ROM_INT(IP_DROP_MEMBERSHIP) }, + + { MP_ROM_QSTR(MP_QSTR_IPPROTO_TCP), MP_ROM_INT(IP_PROTO_TCP) }, + { MP_ROM_QSTR(MP_QSTR_TCP_NODELAY), MP_ROM_INT(TCP_NODELAY) }, }; static MP_DEFINE_CONST_DICT(mp_module_lwip_globals, mp_module_lwip_globals_table); |
