Implemented calculating the effective send-mss based on the MTU of the netif used to send. Enabled by default. Disable by setting LWIP_CALCULATE_EFF_SEND_MSS to 0. This fixes bug #21535.

This commit is contained in:
goldsimon 2007-11-21 18:37:23 +00:00
parent dc515c7ad3
commit 95425552d7
5 changed files with 58 additions and 0 deletions

View File

@ -19,6 +19,11 @@ HISTORY
++ New features:
2007-11-21 Simon Goldschmidt
* tcp.h, opt.h, tcp.c, tcp_in.c: implemented calculating the effective send-mss
based on the MTU of the netif used to send. Enabled by default. Disable by
setting LWIP_CALCULATE_EFF_SEND_MSS to 0. This fixes bug #21535.
2007-11-19 Frédéric Bernon
* api_msg.c, dns.h, dns.c: Implement DNS_DOES_NAME_CHECK option (check if name
received match the name query), implement DNS_USES_STATIC_BUF (the place where

View File

@ -493,6 +493,9 @@ tcp_connect(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port,
pcb->snd_wnd = TCP_WND;
/* The send MSS is updated when an MSS option is received. */
pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
#if LWIP_CALCULATE_EFF_SEND_MSS
pcb->mss = tcp_eff_send_mss(pcb->mss, ipaddr);
#endif /* LWIP_CALCULATE_EFF_SEND_MSS */
pcb->cwnd = 1;
pcb->ssthresh = pcb->mss * 10;
pcb->state = SYN_SENT;
@ -1151,6 +1154,30 @@ tcp_next_iss(void)
return iss;
}
#if LWIP_CALCULATE_EFF_SEND_MSS
/**
* Calcluates the effective send mss that can be used for a specific IP address
* by using ip_route to determin the netif used to send to the address and
* calculating the minimum of TCP_MSS and that netif's mtu (if set).
*/
u16_t
tcp_eff_send_mss(u16_t sendmss, struct ip_addr *addr)
{
u16_t mss_s;
struct netif *outif;
outif = ip_route(addr);
if ((outif != NULL) && (outif->mtu != 0)) {
mss_s = outif->mtu - IP_HLEN - TCP_HLEN;
/* RFC 1122, chap 4.2.2.6:
* Eff.snd.MSS = min(SendMSS+20, MMS_S) - TCPhdrsize - IPoptionsize
* but we only send options with SYN and that is never filled with data! */
sendmss = LWIP_MIN(sendmss, mss_s);
}
return sendmss;
}
#endif /* LWIP_CALCULATE_EFF_SEND_MSS */
#if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG
/**
* Print a tcp header for debugging purposes.

View File

@ -412,6 +412,9 @@ tcp_listen_input(struct tcp_pcb_listen *pcb)
/* Parse any options in the SYN. */
tcp_parseopt(npcb);
#if LWIP_CALCULATE_EFF_SEND_MSS
npcb->mss = tcp_eff_send_mss(npcb->mss, &(npcb->remote_ip));
#endif /* LWIP_CALCULATE_EFF_SEND_MSS */
snmp_inc_tcppassiveopens();
@ -519,6 +522,9 @@ tcp_process(struct tcp_pcb *pcb)
/* Parse any options in the SYNACK before using pcb->mss since that
* can be changed by the received options! */
tcp_parseopt(pcb);
#if LWIP_CALCULATE_EFF_SEND_MSS
pcb->mss = tcp_eff_send_mss(pcb->mss, &(pcb->remote_ip));
#endif /* LWIP_CALCULATE_EFF_SEND_MSS */
/* Set ssthresh again after changing pcb->mss (already set in tcp_connect
* but for the default value of pcb->mss) */

View File

@ -636,11 +636,27 @@
/**
* TCP_MSS: TCP Maximum segment size. (default is 128, a *very*
* conservative default.)
* For the receive side, this MSS is advertised to the remote side
* when opening a connection. For the transmit size, this MSS sets
* an upper limit on the MSS advertised by the remote host.
*/
#ifndef TCP_MSS
#define TCP_MSS 128
#endif
/**
* LWIP_CALCULATE_EFF_SEND_MSS: "The maximum size of a segment that TCP really
* sends, the 'effective send MSS,' MUST be the smaller of the send MSS (which
* reflects the available reassembly buffer size at the remote host) and the
* largest size permitted by the IP layer" (RFC 1122)
* Setting this to 1 enables code that checks TCP_MSS against the MTU of the
* netif used for a connection and limits the MSS it would be too big otherwise.
*/
#ifndef LWIP_CALCULATE_EFF_SEND_MSS
#define LWIP_CALCULATE_EFF_SEND_MSS 1
#endif
/**
* TCP_SND_BUF: TCP sender buffer space (bytes).
*/

View File

@ -508,6 +508,10 @@ u32_t tcp_next_iss(void);
void tcp_keepalive(struct tcp_pcb *pcb);
#if LWIP_CALCULATE_EFF_SEND_MSS
u16_t tcp_eff_send_mss(u16_t sendmss, struct ip_addr *addr);
#endif /* LWIP_CALCULATE_EFF_SEND_MSS*/
extern struct tcp_pcb *tcp_input_pcb;
extern u32_t tcp_ticks;