forked from luck/tmp_suning_uos_patched
bnx2x: fix UDP csum offload
Fixed packets parameters for FW in UDP checksum offload flow. Do not dereference TCP headers on non TCP frames. Reported-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: Dmitry Kravkov <dmitry@broadcom.com> Signed-off-by: Eilon Greenstein <eilong@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
13f172ff26
commit
e39aece7d4
@ -2019,15 +2019,23 @@ static inline void bnx2x_set_pbd_gso(struct sk_buff *skb,
|
||||
static inline u8 bnx2x_set_pbd_csum_e2(struct bnx2x *bp, struct sk_buff *skb,
|
||||
u32 *parsing_data, u32 xmit_type)
|
||||
{
|
||||
*parsing_data |= ((tcp_hdrlen(skb)/4) <<
|
||||
ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW_SHIFT) &
|
||||
ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW;
|
||||
*parsing_data |=
|
||||
((((u8 *)skb_transport_header(skb) - skb->data) >> 1) <<
|
||||
ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W_SHIFT) &
|
||||
ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W;
|
||||
|
||||
*parsing_data |= ((((u8 *)tcp_hdr(skb) - skb->data) / 2) <<
|
||||
ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W_SHIFT) &
|
||||
ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W;
|
||||
if (xmit_type & XMIT_CSUM_TCP) {
|
||||
*parsing_data |= ((tcp_hdrlen(skb) / 4) <<
|
||||
ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW_SHIFT) &
|
||||
ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW;
|
||||
|
||||
return skb_transport_header(skb) + tcp_hdrlen(skb) - skb->data;
|
||||
return skb_transport_header(skb) + tcp_hdrlen(skb) - skb->data;
|
||||
} else
|
||||
/* We support checksum offload for TCP and UDP only.
|
||||
* No need to pass the UDP header length - it's a constant.
|
||||
*/
|
||||
return skb_transport_header(skb) +
|
||||
sizeof(struct udphdr) - skb->data;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2043,7 +2051,7 @@ static inline u8 bnx2x_set_pbd_csum(struct bnx2x *bp, struct sk_buff *skb,
|
||||
struct eth_tx_parse_bd_e1x *pbd,
|
||||
u32 xmit_type)
|
||||
{
|
||||
u8 hlen = (skb_network_header(skb) - skb->data) / 2;
|
||||
u8 hlen = (skb_network_header(skb) - skb->data) >> 1;
|
||||
|
||||
/* for now NS flag is not used in Linux */
|
||||
pbd->global_data =
|
||||
@ -2051,9 +2059,15 @@ static inline u8 bnx2x_set_pbd_csum(struct bnx2x *bp, struct sk_buff *skb,
|
||||
ETH_TX_PARSE_BD_E1X_LLC_SNAP_EN_SHIFT));
|
||||
|
||||
pbd->ip_hlen_w = (skb_transport_header(skb) -
|
||||
skb_network_header(skb)) / 2;
|
||||
skb_network_header(skb)) >> 1;
|
||||
|
||||
hlen += pbd->ip_hlen_w + tcp_hdrlen(skb) / 2;
|
||||
hlen += pbd->ip_hlen_w;
|
||||
|
||||
/* We support checksum offload for TCP and UDP only */
|
||||
if (xmit_type & XMIT_CSUM_TCP)
|
||||
hlen += tcp_hdrlen(skb) / 2;
|
||||
else
|
||||
hlen += sizeof(struct udphdr) / 2;
|
||||
|
||||
pbd->total_hlen_w = cpu_to_le16(hlen);
|
||||
hlen = hlen*2;
|
||||
|
Loading…
Reference in New Issue
Block a user