“d254230687d7ed0f3daf851feaf9058111eb7ab6”上不存在“...fluid/git@gitcode.net:paddlepaddle/PaddleDetection.git”
提交 e39aece7 编写于 作者: V Vladislav Zolotarov 提交者: David S. Miller

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: NEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: NDmitry Kravkov <dmitry@broadcom.com>
Signed-off-by: NEilon Greenstein <eilong@broadcom.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 13f172ff
...@@ -2019,15 +2019,23 @@ static inline void bnx2x_set_pbd_gso(struct sk_buff *skb, ...@@ -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, static inline u8 bnx2x_set_pbd_csum_e2(struct bnx2x *bp, struct sk_buff *skb,
u32 *parsing_data, u32 xmit_type) u32 *parsing_data, u32 xmit_type)
{ {
*parsing_data |= ((tcp_hdrlen(skb)/4) << *parsing_data |=
ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW_SHIFT) & ((((u8 *)skb_transport_header(skb) - skb->data) >> 1) <<
ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW; 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) << if (xmit_type & XMIT_CSUM_TCP) {
ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W_SHIFT) & *parsing_data |= ((tcp_hdrlen(skb) / 4) <<
ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W; 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, ...@@ -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, struct eth_tx_parse_bd_e1x *pbd,
u32 xmit_type) 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 */ /* for now NS flag is not used in Linux */
pbd->global_data = pbd->global_data =
...@@ -2051,9 +2059,15 @@ static inline u8 bnx2x_set_pbd_csum(struct bnx2x *bp, struct sk_buff *skb, ...@@ -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)); ETH_TX_PARSE_BD_E1X_LLC_SNAP_EN_SHIFT));
pbd->ip_hlen_w = (skb_transport_header(skb) - 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); pbd->total_hlen_w = cpu_to_le16(hlen);
hlen = hlen*2; hlen = hlen*2;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册