netdev
[Top] [All Lists]

[PATCH 11/11] [NET] Reorder struct tcp_options_received

To: "David S. Miller" <davem@xxxxxxxxxxxxx>
Subject: [PATCH 11/11] [NET] Reorder struct tcp_options_received
From: Thomas Graf <tgraf@xxxxxxx>
Date: Wed, 9 Mar 2005 20:52:16 +0100
Cc: netdev@xxxxxxxxxxx
In-reply-to: <20050309194521.GH31837@xxxxxxxxxxxxxx>
References: <20050309194521.GH31837@xxxxxxxxxxxxxx>
Sender: netdev-bounce@xxxxxxxxxxx
Reorders struct tcp_options_received to avoid padding and shrinks the
following fields to more appropriate sizes saving 8 bytes.

saw_tstamp: char -> 1 bit
tstamp_ok: char -> 1 bit
sack_ok: char -> 4 bits
wscale_ok: char -> 1 bit
snd_wscale: u8 -> 4 bits
rcv_wscale: u8 -> 4 bits
dsack: u8 -> 1 bit

Signed-off-by: Thomas Graf <tgraf@xxxxxxx>

diff -Nru linux-2.6.11-rc4.orig/include/linux/tcp.h 
linux-2.6.11-rc4/include/linux/tcp.h
--- linux-2.6.11-rc4.orig/include/linux/tcp.h   2005-03-09 14:16:28.000000000 
+0100
+++ linux-2.6.11-rc4/include/linux/tcp.h        2005-03-09 17:07:48.000000000 
+0100
@@ -216,17 +216,16 @@
        __u32   ts_recent;      /* Time stamp to echo next              */
        __u32   rcv_tsval;      /* Time stamp value                     */
        __u32   rcv_tsecr;      /* Time stamp echo reply                */
-       char    saw_tstamp;     /* Saw TIMESTAMP on last packet         */
-       char    tstamp_ok;      /* TIMESTAMP seen on SYN packet         */
-       char    sack_ok;        /* SACK seen on SYN packet              */
-       char    wscale_ok;      /* Wscale seen on SYN packet            */
-       __u8    snd_wscale;     /* Window scaling received from sender  */
-       __u8    rcv_wscale;     /* Window scaling to send to receiver   */
+       __u16   saw_tstamp : 1, /* Saw TIMESTAMP on last packet         */
+               tstamp_ok : 1,  /* TIMESTAMP seen on SYN packet         */
+               dsack : 1,      /* D-SACK is scheduled                  */
+               wscale_ok : 1,  /* Wscale seen on SYN packet            */
+               sack_ok : 4,    /* SACK seen on SYN packet              */
+               snd_wscale : 4, /* Window scaling received from sender  */
+               rcv_wscale : 4; /* Window scaling to send to receiver   */
 /*     SACKs data      */
-       __u8    dsack;          /* D-SACK is scheduled                  */
        __u8    eff_sacks;      /* Size of SACK array to send with next packet 
*/
        __u8    num_sacks;      /* Number of SACK blocks                */
-       __u8    __pad;
        __u16   user_mss;       /* mss requested by user in ioctl */
        __u16   mss_clamp;      /* Maximal mss, negotiated at connection setup 
*/
 };
diff -Nru linux-2.6.11-rc4.orig/net/ipv4/tcp_input.c 
linux-2.6.11-rc4/net/ipv4/tcp_input.c
--- linux-2.6.11-rc4.orig/net/ipv4/tcp_input.c  2005-03-09 15:22:43.000000000 
+0100
+++ linux-2.6.11-rc4/net/ipv4/tcp_input.c       2005-03-09 16:59:40.000000000 
+0100
@@ -3018,15 +3018,16 @@
                                case TCPOPT_WINDOW:
                                        if(opsize==TCPOLEN_WINDOW && th->syn && 
!estab)
                                                if (sysctl_tcp_window_scaling) {
+                                                       __u8 snd_wscale = 
*(__u8 *) ptr;
                                                        opt_rx->wscale_ok = 1;
-                                                       opt_rx->snd_wscale = 
*(__u8 *)ptr;
-                                                       if(opt_rx->snd_wscale > 
14) {
+                                                       if (snd_wscale > 14) {
                                                                
if(net_ratelimit())
                                                                        
printk(KERN_INFO "tcp_parse_options: Illegal window "
                                                                               
"scaling value %d >14 received.\n",
-                                                                              
opt_rx->snd_wscale);
-                                                               
opt_rx->snd_wscale = 14;
+                                                                              
snd_wscale);
+                                                               snd_wscale = 14;
                                                        }
+                                                       opt_rx->snd_wscale = 
snd_wscale;
                                                }
                                        break;
                                case TCPOPT_TIMESTAMP:
diff -Nru linux-2.6.11-rc4.orig/net/ipv4/tcp_output.c 
linux-2.6.11-rc4/net/ipv4/tcp_output.c
--- linux-2.6.11-rc4.orig/net/ipv4/tcp_output.c 2005-03-09 15:22:43.000000000 
+0100
+++ linux-2.6.11-rc4/net/ipv4/tcp_output.c      2005-03-09 16:44:59.000000000 
+0100
@@ -1427,6 +1427,7 @@
 {
        struct dst_entry *dst = __sk_dst_get(sk);
        struct tcp_sock *tp = tcp_sk(sk);
+       __u8 rcv_wscale;
 
        /* We'll fix this up when we get a response from the other end.
         * See tcp_input.c:tcp_rcv_state_process case TCP_SYN_SENT.
@@ -1451,8 +1452,9 @@
                                  &tp->rcv_wnd,
                                  &tp->window_clamp,
                                  sysctl_tcp_window_scaling,
-                                 &tp->rx_opt.rcv_wscale);
+                                 &rcv_wscale);
 
+       tp->rx_opt.rcv_wscale = rcv_wscale;
        tp->rcv_ssthresh = tp->rcv_wnd;
 
        sk->sk_err = 0;

<Prev in Thread] Current Thread [Next in Thread>