Skip to content

Commit 9d6bd75

Browse files
Saeed Mahameeddavem330
authored andcommitted
net/mlx5e: IPoIB, RX handler
Implement IPoIB RX SKB handler. Signed-off-by: Saeed Mahameed <saeedm@mellanox.com> Reviewed-by: Erez Shitrit <erezsh@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 20fd0c1 commit 9d6bd75

File tree

3 files changed

+81
-0
lines changed

3 files changed

+81
-0
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en_rx.c

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,3 +1031,81 @@ void mlx5e_free_xdpsq_descs(struct mlx5e_xdpsq *sq)
10311031
mlx5e_page_release(rq, di, false);
10321032
}
10331033
}
1034+
1035+
#ifdef CONFIG_MLX5_CORE_IPOIB
1036+
1037+
#define MLX5_IB_GRH_DGID_OFFSET 24
1038+
#define MLX5_IB_GRH_BYTES 40
1039+
#define MLX5_IPOIB_ENCAP_LEN 4
1040+
#define MLX5_GID_SIZE 16
1041+
1042+
static inline void mlx5i_complete_rx_cqe(struct mlx5e_rq *rq,
1043+
struct mlx5_cqe64 *cqe,
1044+
u32 cqe_bcnt,
1045+
struct sk_buff *skb)
1046+
{
1047+
struct net_device *netdev = rq->netdev;
1048+
u8 *dgid;
1049+
u8 g;
1050+
1051+
g = (be32_to_cpu(cqe->flags_rqpn) >> 28) & 3;
1052+
dgid = skb->data + MLX5_IB_GRH_DGID_OFFSET;
1053+
if ((!g) || dgid[0] != 0xff)
1054+
skb->pkt_type = PACKET_HOST;
1055+
else if (memcmp(dgid, netdev->broadcast + 4, MLX5_GID_SIZE) == 0)
1056+
skb->pkt_type = PACKET_BROADCAST;
1057+
else
1058+
skb->pkt_type = PACKET_MULTICAST;
1059+
1060+
/* TODO: IB/ipoib: Allow mcast packets from other VFs
1061+
* 68996a6e760e5c74654723eeb57bf65628ae87f4
1062+
*/
1063+
1064+
skb_pull(skb, MLX5_IB_GRH_BYTES);
1065+
1066+
skb->protocol = *((__be16 *)(skb->data));
1067+
1068+
skb->ip_summed = CHECKSUM_COMPLETE;
1069+
skb->csum = csum_unfold((__force __sum16)cqe->check_sum);
1070+
1071+
skb_record_rx_queue(skb, rq->ix);
1072+
1073+
if (likely(netdev->features & NETIF_F_RXHASH))
1074+
mlx5e_skb_set_hash(cqe, skb);
1075+
1076+
skb_reset_mac_header(skb);
1077+
skb_pull(skb, MLX5_IPOIB_ENCAP_LEN);
1078+
1079+
skb->dev = netdev;
1080+
1081+
rq->stats.csum_complete++;
1082+
rq->stats.packets++;
1083+
rq->stats.bytes += cqe_bcnt;
1084+
}
1085+
1086+
void mlx5i_handle_rx_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe)
1087+
{
1088+
struct mlx5e_rx_wqe *wqe;
1089+
__be16 wqe_counter_be;
1090+
struct sk_buff *skb;
1091+
u16 wqe_counter;
1092+
u32 cqe_bcnt;
1093+
1094+
wqe_counter_be = cqe->wqe_counter;
1095+
wqe_counter = be16_to_cpu(wqe_counter_be);
1096+
wqe = mlx5_wq_ll_get_wqe(&rq->wq, wqe_counter);
1097+
cqe_bcnt = be32_to_cpu(cqe->byte_cnt);
1098+
1099+
skb = skb_from_cqe(rq, cqe, wqe_counter, cqe_bcnt);
1100+
if (!skb)
1101+
goto wq_ll_pop;
1102+
1103+
mlx5i_complete_rx_cqe(rq, cqe, cqe_bcnt, skb);
1104+
napi_gro_receive(rq->cq.napi, skb);
1105+
1106+
wq_ll_pop:
1107+
mlx5_wq_ll_pop(&rq->wq, wqe_counter_be,
1108+
&wqe->next.next_wqe_index);
1109+
}
1110+
1111+
#endif /* CONFIG_MLX5_CORE_IPOIB */

drivers/net/ethernet/mellanox/mlx5/core/ipoib.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,8 @@ static const struct mlx5e_profile mlx5i_nic_profile = {
282282
.disable = NULL, /* mlx5i_disable */
283283
.update_stats = NULL, /* mlx5i_update_stats */
284284
.max_nch = mlx5e_get_max_num_channels,
285+
.rx_handlers.handle_rx_cqe = mlx5i_handle_rx_cqe,
286+
.rx_handlers.handle_rx_cqe_mpwqe = NULL, /* Not supported */
285287
.max_tc = MLX5I_MAX_NUM_TC,
286288
};
287289

drivers/net/ethernet/mellanox/mlx5/core/ipoib.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,6 @@ struct mlx5i_priv {
4949

5050
netdev_tx_t mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
5151
struct mlx5_av *av, u32 dqpn, u32 dqkey);
52+
void mlx5i_handle_rx_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe);
5253

5354
#endif /* __MLX5E_IPOB_H__ */

0 commit comments

Comments
 (0)