diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2007-03-18 20:43:48 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-04-26 01:25:24 -0400 |
commit | ab6a5bb6b28a970104a34f0f6959b73cf61bdc72 (patch) | |
tree | 54cfa7d4fe00d0c28a60022b075afc0856d6fc2b | |
parent | 88c7664f13bd1a36acb8566b93892a4c58759ac6 (diff) |
[TCP]: Introduce tcp_hdrlen() and tcp_optlen()
The ip_hdrlen() buddy, created to reduce the number of skb->h.th-> uses and to
avoid the longer, open coded equivalent.
Ditched a no-op in bnx2 in the process.
I wonder if we should have a BUG_ON(skb->h.th->doff < 5) in tcp_optlen()...
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/atl1/atl1_main.c | 7 | ||||
-rw-r--r-- | drivers/net/bnx2.c | 7 | ||||
-rw-r--r-- | drivers/net/e1000/e1000_main.c | 4 | ||||
-rw-r--r-- | drivers/net/ehea/ehea_main.c | 2 | ||||
-rw-r--r-- | drivers/net/ixgb/ixgb_main.c | 2 | ||||
-rw-r--r-- | drivers/net/myri10ge/myri10ge.c | 3 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_hw.c | 3 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_main.c | 2 | ||||
-rw-r--r-- | drivers/net/sky2.c | 2 | ||||
-rw-r--r-- | drivers/net/tg3.c | 4 | ||||
-rw-r--r-- | drivers/s390/net/qeth_eddp.c | 8 | ||||
-rw-r--r-- | include/linux/tcp.h | 10 | ||||
-rw-r--r-- | net/ipv4/tcp_ipv4.c | 2 | ||||
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 2 |
14 files changed, 32 insertions, 26 deletions
diff --git a/drivers/net/atl1/atl1_main.c b/drivers/net/atl1/atl1_main.c index c26f8ce320e6..8d5994751e2e 100644 --- a/drivers/net/atl1/atl1_main.c +++ b/drivers/net/atl1/atl1_main.c | |||
@@ -1307,7 +1307,7 @@ static int atl1_tso(struct atl1_adapter *adapter, struct sk_buff *skb, | |||
1307 | 1307 | ||
1308 | tso->tsopl |= (iph->ihl & | 1308 | tso->tsopl |= (iph->ihl & |
1309 | CSUM_PARAM_IPHL_MASK) << CSUM_PARAM_IPHL_SHIFT; | 1309 | CSUM_PARAM_IPHL_MASK) << CSUM_PARAM_IPHL_SHIFT; |
1310 | tso->tsopl |= ((skb->h.th->doff << 2) & | 1310 | tso->tsopl |= (tcp_hdrlen(skb) & |
1311 | TSO_PARAM_TCPHDRLEN_MASK) << TSO_PARAM_TCPHDRLEN_SHIFT; | 1311 | TSO_PARAM_TCPHDRLEN_MASK) << TSO_PARAM_TCPHDRLEN_SHIFT; |
1312 | tso->tsopl |= (skb_shinfo(skb)->gso_size & | 1312 | tso->tsopl |= (skb_shinfo(skb)->gso_size & |
1313 | TSO_PARAM_MSS_MASK) << TSO_PARAM_MSS_SHIFT; | 1313 | TSO_PARAM_MSS_MASK) << TSO_PARAM_MSS_SHIFT; |
@@ -1369,8 +1369,7 @@ static void atl1_tx_map(struct atl1_adapter *adapter, | |||
1369 | 1369 | ||
1370 | if (tcp_seg) { | 1370 | if (tcp_seg) { |
1371 | /* TSO/GSO */ | 1371 | /* TSO/GSO */ |
1372 | proto_hdr_len = (skb_transport_offset(skb) + | 1372 | proto_hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb); |
1373 | (skb->h.th->doff << 2)); | ||
1374 | buffer_info->length = proto_hdr_len; | 1373 | buffer_info->length = proto_hdr_len; |
1375 | page = virt_to_page(skb->data); | 1374 | page = virt_to_page(skb->data); |
1376 | offset = (unsigned long)skb->data & ~PAGE_MASK; | 1375 | offset = (unsigned long)skb->data & ~PAGE_MASK; |
@@ -1563,7 +1562,7 @@ static int atl1_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
1563 | if (mss) { | 1562 | if (mss) { |
1564 | if (skb->protocol == htons(ETH_P_IP)) { | 1563 | if (skb->protocol == htons(ETH_P_IP)) { |
1565 | proto_hdr_len = (skb_transport_offset(skb) + | 1564 | proto_hdr_len = (skb_transport_offset(skb) + |
1566 | (skb->h.th->doff << 2)); | 1565 | tcp_hdrlen(skb)); |
1567 | if (unlikely(proto_hdr_len > len)) { | 1566 | if (unlikely(proto_hdr_len > len)) { |
1568 | dev_kfree_skb_any(skb); | 1567 | dev_kfree_skb_any(skb); |
1569 | return NETDEV_TX_OK; | 1568 | return NETDEV_TX_OK; |
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index eb0c4f1d4483..73512fb16452 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
@@ -4521,13 +4521,12 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
4521 | return NETDEV_TX_OK; | 4521 | return NETDEV_TX_OK; |
4522 | } | 4522 | } |
4523 | 4523 | ||
4524 | tcp_opt_len = ((skb->h.th->doff - 5) * 4); | ||
4525 | vlan_tag_flags |= TX_BD_FLAGS_SW_LSO; | 4524 | vlan_tag_flags |= TX_BD_FLAGS_SW_LSO; |
4526 | 4525 | ||
4527 | tcp_opt_len = 0; | 4526 | tcp_opt_len = 0; |
4528 | if (skb->h.th->doff > 5) { | 4527 | if (skb->h.th->doff > 5) |
4529 | tcp_opt_len = (skb->h.th->doff - 5) << 2; | 4528 | tcp_opt_len = tcp_optlen(skb); |
4530 | } | 4529 | |
4531 | ip_tcp_len = ip_hdrlen(skb) + sizeof(struct tcphdr); | 4530 | ip_tcp_len = ip_hdrlen(skb) + sizeof(struct tcphdr); |
4532 | 4531 | ||
4533 | iph = ip_hdr(skb); | 4532 | iph = ip_hdr(skb); |
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index 78cf417cf236..4572fbba50f9 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -2887,7 +2887,7 @@ e1000_tso(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, | |||
2887 | return err; | 2887 | return err; |
2888 | } | 2888 | } |
2889 | 2889 | ||
2890 | hdr_len = (skb_transport_offset(skb) + (skb->h.th->doff << 2)); | 2890 | hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb); |
2891 | mss = skb_shinfo(skb)->gso_size; | 2891 | mss = skb_shinfo(skb)->gso_size; |
2892 | if (skb->protocol == htons(ETH_P_IP)) { | 2892 | if (skb->protocol == htons(ETH_P_IP)) { |
2893 | struct iphdr *iph = ip_hdr(skb); | 2893 | struct iphdr *iph = ip_hdr(skb); |
@@ -3292,7 +3292,7 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
3292 | /* TSO Workaround for 82571/2/3 Controllers -- if skb->data | 3292 | /* TSO Workaround for 82571/2/3 Controllers -- if skb->data |
3293 | * points to just header, pull a few bytes of payload from | 3293 | * points to just header, pull a few bytes of payload from |
3294 | * frags into skb->data */ | 3294 | * frags into skb->data */ |
3295 | hdr_len = (skb_transport_offset(skb) + (skb->h.th->doff << 2)); | 3295 | hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb); |
3296 | if (skb->data_len && (hdr_len == (skb->len - skb->data_len))) { | 3296 | if (skb->data_len && (hdr_len == (skb->len - skb->data_len))) { |
3297 | switch (adapter->hw.mac_type) { | 3297 | switch (adapter->hw.mac_type) { |
3298 | unsigned int pull_size; | 3298 | unsigned int pull_size; |
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c index 0dc701e611e5..63732d2305bb 100644 --- a/drivers/net/ehea/ehea_main.c +++ b/drivers/net/ehea/ehea_main.c | |||
@@ -1300,7 +1300,7 @@ static void write_swqe2_TSO(struct sk_buff *skb, | |||
1300 | /* copy only eth/ip/tcp headers to immediate data and | 1300 | /* copy only eth/ip/tcp headers to immediate data and |
1301 | * the rest of skb->data to sg1entry | 1301 | * the rest of skb->data to sg1entry |
1302 | */ | 1302 | */ |
1303 | headersize = ETH_HLEN + ip_hdrlen(skb) + (skb->h.th->doff * 4); | 1303 | headersize = ETH_HLEN + ip_hdrlen(skb) + tcp_hdrlen(skb); |
1304 | 1304 | ||
1305 | skb_data_size = skb->len - skb->data_len; | 1305 | skb_data_size = skb->len - skb->data_len; |
1306 | 1306 | ||
diff --git a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c index ceea6e45792d..96550d681623 100644 --- a/drivers/net/ixgb/ixgb_main.c +++ b/drivers/net/ixgb/ixgb_main.c | |||
@@ -1190,7 +1190,7 @@ ixgb_tso(struct ixgb_adapter *adapter, struct sk_buff *skb) | |||
1190 | return err; | 1190 | return err; |
1191 | } | 1191 | } |
1192 | 1192 | ||
1193 | hdr_len = (skb_transport_offset(skb) + (skb->h.th->doff << 2)); | 1193 | hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb); |
1194 | mss = skb_shinfo(skb)->gso_size; | 1194 | mss = skb_shinfo(skb)->gso_size; |
1195 | iph = ip_hdr(skb); | 1195 | iph = ip_hdr(skb); |
1196 | iph->tot_len = 0; | 1196 | iph->tot_len = 0; |
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c index e04228c7b14f..e4b69a0485ba 100644 --- a/drivers/net/myri10ge/myri10ge.c +++ b/drivers/net/myri10ge/myri10ge.c | |||
@@ -2054,8 +2054,7 @@ again: | |||
2054 | * send loop that we are still in the | 2054 | * send loop that we are still in the |
2055 | * header portion of the TSO packet. | 2055 | * header portion of the TSO packet. |
2056 | * TSO header must be at most 134 bytes long */ | 2056 | * TSO header must be at most 134 bytes long */ |
2057 | cum_len = -(skb_transport_offset(skb) + | 2057 | cum_len = -(skb_transport_offset(skb) + tcp_hdrlen(skb)); |
2058 | (skb->h.th->doff << 2)); | ||
2059 | 2058 | ||
2060 | /* for TSO, pseudo_hdr_offset holds mss. | 2059 | /* for TSO, pseudo_hdr_offset holds mss. |
2061 | * The firmware figures out where to put | 2060 | * The firmware figures out where to put |
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c index 09ca2192cbfa..0fba8f190762 100644 --- a/drivers/net/netxen/netxen_nic_hw.c +++ b/drivers/net/netxen/netxen_nic_hw.c | |||
@@ -374,8 +374,7 @@ void netxen_tso_check(struct netxen_adapter *adapter, | |||
374 | { | 374 | { |
375 | if (desc->mss) { | 375 | if (desc->mss) { |
376 | desc->total_hdr_length = (sizeof(struct ethhdr) + | 376 | desc->total_hdr_length = (sizeof(struct ethhdr) + |
377 | ip_hdrlen(skb) + | 377 | ip_hdrlen(skb) + tcp_hdrlen(skb)); |
378 | skb->h.th->doff * 4); | ||
379 | netxen_set_cmd_desc_opcode(desc, TX_TCP_LSO); | 378 | netxen_set_cmd_desc_opcode(desc, TX_TCP_LSO); |
380 | } else if (skb->ip_summed == CHECKSUM_PARTIAL) { | 379 | } else if (skb->ip_summed == CHECKSUM_PARTIAL) { |
381 | if (ip_hdr(skb)->protocol == IPPROTO_TCP) { | 380 | if (ip_hdr(skb)->protocol == IPPROTO_TCP) { |
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index b548a30e5c8e..b488e94bc4c0 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
@@ -779,7 +779,7 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
779 | if (skb_shinfo(skb)->gso_size > 0) { | 779 | if (skb_shinfo(skb)->gso_size > 0) { |
780 | 780 | ||
781 | no_of_desc++; | 781 | no_of_desc++; |
782 | if ((ip_hdrlen(skb) + skb->h.th->doff * 4 + | 782 | if ((ip_hdrlen(skb) + tcp_hdrlen(skb) + |
783 | sizeof(struct ethhdr)) > | 783 | sizeof(struct ethhdr)) > |
784 | (sizeof(struct cmd_desc_type0) - 2)) { | 784 | (sizeof(struct cmd_desc_type0) - 2)) { |
785 | no_of_desc++; | 785 | no_of_desc++; |
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index a35f2f2784ae..fd291fc93169 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
@@ -1392,7 +1392,7 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) | |||
1392 | /* Check for TCP Segmentation Offload */ | 1392 | /* Check for TCP Segmentation Offload */ |
1393 | mss = skb_shinfo(skb)->gso_size; | 1393 | mss = skb_shinfo(skb)->gso_size; |
1394 | if (mss != 0) { | 1394 | if (mss != 0) { |
1395 | mss += ((skb->h.th->doff - 5) * 4); /* TCP options */ | 1395 | mss += tcp_optlen(skb); /* TCP options */ |
1396 | mss += ip_hdrlen(skb) + sizeof(struct tcphdr); | 1396 | mss += ip_hdrlen(skb) + sizeof(struct tcphdr); |
1397 | mss += ETH_HLEN; | 1397 | mss += ETH_HLEN; |
1398 | 1398 | ||
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 76a31afe20de..7ca30d76bf6f 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -3911,7 +3911,7 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3911 | else { | 3911 | else { |
3912 | struct iphdr *iph = ip_hdr(skb); | 3912 | struct iphdr *iph = ip_hdr(skb); |
3913 | 3913 | ||
3914 | tcp_opt_len = ((skb->h.th->doff - 5) * 4); | 3914 | tcp_opt_len = tcp_optlen(skb); |
3915 | ip_tcp_len = ip_hdrlen(skb) + sizeof(struct tcphdr); | 3915 | ip_tcp_len = ip_hdrlen(skb) + sizeof(struct tcphdr); |
3916 | 3916 | ||
3917 | iph->check = 0; | 3917 | iph->check = 0; |
@@ -4065,7 +4065,7 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) | |||
4065 | goto out_unlock; | 4065 | goto out_unlock; |
4066 | } | 4066 | } |
4067 | 4067 | ||
4068 | tcp_opt_len = ((skb->h.th->doff - 5) * 4); | 4068 | tcp_opt_len = tcp_optlen(skb); |
4069 | ip_tcp_len = ip_hdrlen(skb) + sizeof(struct tcphdr); | 4069 | ip_tcp_len = ip_hdrlen(skb) + sizeof(struct tcphdr); |
4070 | 4070 | ||
4071 | hdr_len = ip_tcp_len + tcp_opt_len; | 4071 | hdr_len = ip_tcp_len + tcp_opt_len; |
diff --git a/drivers/s390/net/qeth_eddp.c b/drivers/s390/net/qeth_eddp.c index 90da58b4e532..273f1745a009 100644 --- a/drivers/s390/net/qeth_eddp.c +++ b/drivers/s390/net/qeth_eddp.c | |||
@@ -477,13 +477,13 @@ qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx, | |||
477 | skb_network_header(skb), | 477 | skb_network_header(skb), |
478 | ip_hdrlen(skb), | 478 | ip_hdrlen(skb), |
479 | skb->h.raw, | 479 | skb->h.raw, |
480 | skb->h.th->doff * 4); | 480 | tcp_hdrlen(skb)); |
481 | else | 481 | else |
482 | eddp = qeth_eddp_create_eddp_data(qhdr, | 482 | eddp = qeth_eddp_create_eddp_data(qhdr, |
483 | skb_network_header(skb), | 483 | skb_network_header(skb), |
484 | sizeof(struct ipv6hdr), | 484 | sizeof(struct ipv6hdr), |
485 | skb->h.raw, | 485 | skb->h.raw, |
486 | skb->h.th->doff * 4); | 486 | tcp_hdrlen(skb)); |
487 | 487 | ||
488 | if (eddp == NULL) { | 488 | if (eddp == NULL) { |
489 | QETH_DBF_TEXT(trace, 2, "eddpfcnm"); | 489 | QETH_DBF_TEXT(trace, 2, "eddpfcnm"); |
@@ -596,11 +596,11 @@ qeth_eddp_create_context_tcp(struct qeth_card *card, struct sk_buff *skb, | |||
596 | ctx = qeth_eddp_create_context_generic(card, skb, | 596 | ctx = qeth_eddp_create_context_generic(card, skb, |
597 | (sizeof(struct qeth_hdr) + | 597 | (sizeof(struct qeth_hdr) + |
598 | ip_hdrlen(skb) + | 598 | ip_hdrlen(skb) + |
599 | skb->h.th->doff * 4)); | 599 | tcp_hdrlen(skb))); |
600 | else if (skb->protocol == htons(ETH_P_IPV6)) | 600 | else if (skb->protocol == htons(ETH_P_IPV6)) |
601 | ctx = qeth_eddp_create_context_generic(card, skb, | 601 | ctx = qeth_eddp_create_context_generic(card, skb, |
602 | sizeof(struct qeth_hdr) + sizeof(struct ipv6hdr) + | 602 | sizeof(struct qeth_hdr) + sizeof(struct ipv6hdr) + |
603 | skb->h.th->doff*4); | 603 | tcp_hdrlen(skb)); |
604 | else | 604 | else |
605 | QETH_DBF_TEXT(trace, 2, "cetcpinv"); | 605 | QETH_DBF_TEXT(trace, 2, "cetcpinv"); |
606 | 606 | ||
diff --git a/include/linux/tcp.h b/include/linux/tcp.h index 18a468dd5055..244ae0dacf4a 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h | |||
@@ -178,6 +178,16 @@ struct tcp_md5sig { | |||
178 | #include <net/inet_connection_sock.h> | 178 | #include <net/inet_connection_sock.h> |
179 | #include <net/inet_timewait_sock.h> | 179 | #include <net/inet_timewait_sock.h> |
180 | 180 | ||
181 | static inline unsigned int tcp_hdrlen(const struct sk_buff *skb) | ||
182 | { | ||
183 | return skb->h.th->doff * 4; | ||
184 | } | ||
185 | |||
186 | static inline unsigned int tcp_optlen(const struct sk_buff *skb) | ||
187 | { | ||
188 | return (skb->h.th->doff - 5) * 4; | ||
189 | } | ||
190 | |||
181 | /* This defines a selective acknowledgement block. */ | 191 | /* This defines a selective acknowledgement block. */ |
182 | struct tcp_sack_block_wire { | 192 | struct tcp_sack_block_wire { |
183 | __be32 start_seq; | 193 | __be32 start_seq; |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 51424df9078e..c146a02f8495 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -1564,7 +1564,7 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb) | |||
1564 | return 0; | 1564 | return 0; |
1565 | } | 1565 | } |
1566 | 1566 | ||
1567 | if (skb->len < (skb->h.th->doff << 2) || tcp_checksum_complete(skb)) | 1567 | if (skb->len < tcp_hdrlen(skb) || tcp_checksum_complete(skb)) |
1568 | goto csum_err; | 1568 | goto csum_err; |
1569 | 1569 | ||
1570 | if (sk->sk_state == TCP_LISTEN) { | 1570 | if (sk->sk_state == TCP_LISTEN) { |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 85b3e89110f9..c573353f21cd 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -1609,7 +1609,7 @@ static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb) | |||
1609 | return 0; | 1609 | return 0; |
1610 | } | 1610 | } |
1611 | 1611 | ||
1612 | if (skb->len < (skb->h.th->doff<<2) || tcp_checksum_complete(skb)) | 1612 | if (skb->len < tcp_hdrlen(skb) || tcp_checksum_complete(skb)) |
1613 | goto csum_err; | 1613 | goto csum_err; |
1614 | 1614 | ||
1615 | if (sk->sk_state == TCP_LISTEN) { | 1615 | if (sk->sk_state == TCP_LISTEN) { |