|
@@ -48,7 +48,6 @@ static void fill_v2_desc(struct hnae_ring *ring, void *priv,
|
|
|
struct iphdr *iphdr;
|
|
|
struct ipv6hdr *ipv6hdr;
|
|
|
struct sk_buff *skb;
|
|
|
- int skb_tmp_len;
|
|
|
__be16 protocol;
|
|
|
u8 bn_pid = 0;
|
|
|
u8 rrcfv = 0;
|
|
@@ -66,10 +65,14 @@ static void fill_v2_desc(struct hnae_ring *ring, void *priv,
|
|
|
desc->addr = cpu_to_le64(dma);
|
|
|
desc->tx.send_size = cpu_to_le16((u16)size);
|
|
|
|
|
|
- /*config bd buffer end */
|
|
|
+ /* config bd buffer end */
|
|
|
hnae_set_bit(rrcfv, HNSV2_TXD_VLD_B, 1);
|
|
|
hnae_set_field(bn_pid, HNSV2_TXD_BUFNUM_M, 0, buf_num - 1);
|
|
|
|
|
|
+ /* fill port_id in the tx bd for sending management pkts */
|
|
|
+ hnae_set_field(bn_pid, HNSV2_TXD_PORTID_M,
|
|
|
+ HNSV2_TXD_PORTID_S, ring->q->handle->dport_id);
|
|
|
+
|
|
|
if (type == DESC_TYPE_SKB) {
|
|
|
skb = (struct sk_buff *)priv;
|
|
|
|
|
@@ -90,13 +93,13 @@ static void fill_v2_desc(struct hnae_ring *ring, void *priv,
|
|
|
hnae_set_bit(rrcfv, HNSV2_TXD_L4CS_B, 1);
|
|
|
|
|
|
/* check for tcp/udp header */
|
|
|
- if (iphdr->protocol == IPPROTO_TCP) {
|
|
|
+ if (iphdr->protocol == IPPROTO_TCP &&
|
|
|
+ skb_is_gso(skb)) {
|
|
|
hnae_set_bit(tvsvsn,
|
|
|
HNSV2_TXD_TSE_B, 1);
|
|
|
- skb_tmp_len = SKB_TMP_LEN(skb);
|
|
|
l4_len = tcp_hdrlen(skb);
|
|
|
- mss = mtu - skb_tmp_len - ETH_FCS_LEN;
|
|
|
- paylen = skb->len - skb_tmp_len;
|
|
|
+ mss = skb_shinfo(skb)->gso_size;
|
|
|
+ paylen = skb->len - SKB_TMP_LEN(skb);
|
|
|
}
|
|
|
} else if (skb->protocol == htons(ETH_P_IPV6)) {
|
|
|
hnae_set_bit(tvsvsn, HNSV2_TXD_IPV6_B, 1);
|
|
@@ -104,13 +107,13 @@ static void fill_v2_desc(struct hnae_ring *ring, void *priv,
|
|
|
hnae_set_bit(rrcfv, HNSV2_TXD_L4CS_B, 1);
|
|
|
|
|
|
/* check for tcp/udp header */
|
|
|
- if (ipv6hdr->nexthdr == IPPROTO_TCP) {
|
|
|
+ if (ipv6hdr->nexthdr == IPPROTO_TCP &&
|
|
|
+ skb_is_gso(skb) && skb_is_gso_v6(skb)) {
|
|
|
hnae_set_bit(tvsvsn,
|
|
|
HNSV2_TXD_TSE_B, 1);
|
|
|
- skb_tmp_len = SKB_TMP_LEN(skb);
|
|
|
l4_len = tcp_hdrlen(skb);
|
|
|
- mss = mtu - skb_tmp_len - ETH_FCS_LEN;
|
|
|
- paylen = skb->len - skb_tmp_len;
|
|
|
+ mss = skb_shinfo(skb)->gso_size;
|
|
|
+ paylen = skb->len - SKB_TMP_LEN(skb);
|
|
|
}
|
|
|
}
|
|
|
desc->tx.ip_offset = ip_offset;
|
|
@@ -564,6 +567,7 @@ static int hns_nic_poll_rx_skb(struct hns_nic_ring_data *ring_data,
|
|
|
struct sk_buff *skb;
|
|
|
struct hnae_desc *desc;
|
|
|
struct hnae_desc_cb *desc_cb;
|
|
|
+ struct ethhdr *eh;
|
|
|
unsigned char *va;
|
|
|
int bnum, length, i;
|
|
|
int pull_len;
|
|
@@ -670,6 +674,14 @@ out_bnum_err:
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
|
|
|
+ /* filter out multicast pkt with the same src mac as this port */
|
|
|
+ eh = eth_hdr(skb);
|
|
|
+ if (unlikely(is_multicast_ether_addr(eh->h_dest) &&
|
|
|
+ ether_addr_equal(ndev->dev_addr, eh->h_source))) {
|
|
|
+ dev_kfree_skb_any(skb);
|
|
|
+ return -EFAULT;
|
|
|
+ }
|
|
|
+
|
|
|
ring->stats.rx_pkts++;
|
|
|
ring->stats.rx_bytes += skb->len;
|
|
|
|