|
@@ -43,6 +43,8 @@ struct tcp_connection {
|
43
|
43
|
struct sockaddr_tcpip peer;
|
44
|
44
|
/** Local port */
|
45
|
45
|
unsigned int local_port;
|
|
46
|
+ /** Maximum segment size */
|
|
47
|
+ size_t mss;
|
46
|
48
|
|
47
|
49
|
/** Current TCP state */
|
48
|
50
|
unsigned int tcp_state;
|
|
@@ -250,6 +252,7 @@ static int tcp_open ( struct interface *xfer, struct sockaddr *peer,
|
250
|
252
|
struct sockaddr_tcpip *st_peer = ( struct sockaddr_tcpip * ) peer;
|
251
|
253
|
struct sockaddr_tcpip *st_local = ( struct sockaddr_tcpip * ) local;
|
252
|
254
|
struct tcp_connection *tcp;
|
|
255
|
+ size_t mtu;
|
253
|
256
|
int port;
|
254
|
257
|
int rc;
|
255
|
258
|
|
|
@@ -271,6 +274,16 @@ static int tcp_open ( struct interface *xfer, struct sockaddr *peer,
|
271
|
274
|
INIT_LIST_HEAD ( &tcp->rx_queue );
|
272
|
275
|
memcpy ( &tcp->peer, st_peer, sizeof ( tcp->peer ) );
|
273
|
276
|
|
|
277
|
+ /* Calculate MSS */
|
|
278
|
+ mtu = tcpip_mtu ( &tcp->peer );
|
|
279
|
+ if ( ! mtu ) {
|
|
280
|
+ DBGC ( tcp, "TCP %p has no route to %s\n",
|
|
281
|
+ tcp, sock_ntoa ( peer ) );
|
|
282
|
+ rc = -ENETUNREACH;
|
|
283
|
+ goto err;
|
|
284
|
+ }
|
|
285
|
+ tcp->mss = ( mtu - sizeof ( struct tcp_header ) );
|
|
286
|
+
|
274
|
287
|
/* Bind to local port */
|
275
|
288
|
port = tcpip_bind ( st_local, tcp_port_available );
|
276
|
289
|
if ( port < 0 ) {
|
|
@@ -552,7 +565,7 @@ static int tcp_xmit ( struct tcp_connection *tcp ) {
|
552
|
565
|
mssopt = iob_push ( iobuf, sizeof ( *mssopt ) );
|
553
|
566
|
mssopt->kind = TCP_OPTION_MSS;
|
554
|
567
|
mssopt->length = sizeof ( *mssopt );
|
555
|
|
- mssopt->mss = htons ( TCP_MSS );
|
|
568
|
+ mssopt->mss = htons ( tcp->mss );
|
556
|
569
|
wsopt = iob_push ( iobuf, sizeof ( *wsopt ) );
|
557
|
570
|
wsopt->nop = TCP_OPTION_NOP;
|
558
|
571
|
wsopt->wsopt.kind = TCP_OPTION_WS;
|