How to Disable RDMA ICRC Check on ConnectX-7 (on BlueField-3)?

Hi,

I am looking for a method to disable the RDMA Invariant CRC (ICRC) validation on the embedded ConnectX-7 NIC of my BlueField-3 DPU.

Scenario and Goal:
My setup consists of several BlueField-3 DPU connected to a Tofino switch. The Tofino switch is configured to modify certain fields in the RoCEv2 header of received packets. This modification consequently invalidates the packet’s original ICRC.

My goal is to configure the receiving ConnectX-7 RNIC to accept these modified packets by completely disabling its ICRC validation, thereby ignoring the CRC mismatch.

What I’ve Tried:
I have found a script in this GitHub issue: How to disable ICRC on RNICs? · Issue #5 · p4lang/p4app-switchML · GitHub.

While this script works perfectly on my ConnectX-5, it appears to have no effect on the ConnectX-7. On the CX-7, the ICRC check remains active, and the modified packets are subsequently dropped.

My Question:
Is there an official or community-verified method to disable the ICRC functionality on a ConnectX-7 NIC?

Thank you in advance for any help or guidance.

For reference, here is our environment information:

ubuntu@sgpu03:~$ sudo mlxconfig -d /dev/mst/mt41692_pciconf0 -e q

Device #1:
----------

Device type:        BlueField3          
Name:               900-9D3B6-00CN-A_Ax 
Description:        NVIDIA BlueField-3 B3240 P-Series Dual-slot FHHL DPU; 400GbE / NDR IB (default mode); Dual-port QSFP112; PCIe Gen5.0 x16 with x16 PCIe extension option; 16 Arm cores; 32GB on-board DDR; integrated BMC; Crypto Enabled
Device:             /dev/mst/mt41692_pciconf0

ubuntu@sgpu03:~$ sudo mlxburn -d /dev/mst/mt41692_pciconf0  query
-I- Image type:            FS4
-I- FW Version:            32.43.2566
-I- FW Release Date:       23.2.2025
-I- Product Version:       32.43.2566
-I- Rom Info:              type=UEFI Virtio net version=21.4.13 cpu=AMD64,AARCH64
-I-                        type=UEFI Virtio blk version=22.4.14 cpu=AMD64,AARCH64
-I-                        type=UEFI version=14.37.13 cpu=AMD64,AARCH64
-I-                        type=PXE version=3.7.500 cpu=AMD64
-I- Description:           UID                GuidsNumber
-I- Base GUID:             7c8c090300bf34aa        38
-I- Base MAC:              7c8c09bf34aa            38
-I- Image VSD:             N/A
-I- Device VSD:            N/A
-I- PSID:                  MT_0000000883
-I- Security Attributes:   secure-fw

ubuntu@sgpu03:~$ cat /opt/mellanox/doca/applications/VERSION 
2.9.2005

hi

You use mlxreg Utility - NVIDIA Docs

mlxreg -d /dev/mst/mt41692_pciconf0 --show_reg PCMR

modify the bit rx_icrc_chk_dis(if have) in reg PCMR to disable icrc

If you still have question please kindly contact https://enterprise-support.NVIDIA.com/s/create-case

Hi

After executing this command, I got the following output:

Field Name                      | Address (Bytes) | Offset (Bits) | Size (Bits) | Access
=========================================================================================
lp_msb                          | 0x00000000      | 12            | 2           | INDEX
local_port                      | 0x00000000      | 16            | 8           | INDEX
fcs_cap                         | 0x00000004      | 1             | 1           | RO
rx_ts_over_crc_cap              | 0x00000004      | 13            | 1           | RO
rx_fcs_drop_cap                 | 0x00000004      | 14            | 1           | RO
tx_fcs_recalc_cap               | 0x00000004      | 15            | 1           | RO
tx_ts_over_crc_cap              | 0x00000004      | 16            | 1           | RO
encap_replace_ipv4_id_en_cap    | 0x00000004      | 25            | 1           | RO
mpls_explicit_null_en_cap       | 0x00000004      | 26            | 1           | RO
rx_icrc_chk_dis_cap             | 0x00000004      | 27            | 1           | RO
entropy_gre_calc_cap            | 0x00000004      | 29            | 1           | RO
entropy_calc_cap                | 0x00000004      | 30            | 1           | RO
force_entropy_cap               | 0x00000004      | 31            | 1           | RO
fcs_chk                         | 0x00000008      | 1             | 1           | RW
rx_ts_over_crc                  | 0x00000008      | 13            | 1           | RW
rx_fcs_drop                     | 0x00000008      | 14            | 1           | RW
tx_fcs_recalc                   | 0x00000008      | 15            | 1           | RW
tx_ts_over_crc                  | 0x00000008      | 16            | 1           | RW
encap_replace_ipv4_id_en        | 0x00000008      | 25            | 1           | RW
mpls_explicit_null_en           | 0x00000008      | 26            | 1           | RW
rx_icrc_chk_dis                 | 0x00000008      | 27            | 1           | RW
entropy_gre_calc                | 0x00000008      | 29            | 1           | RW
entropy_calc                    | 0x00000008      | 30            | 1           | RW
force_entropy                   | 0x00000008      | 31            | 1           | RW
=========================================================================================

It seems that there is no rx_icrc_chk_dis field.
I would like to know which driver version supports modifying this register. Thank you very much!

hi wushanbi19

I see rx_icrc_chk_dis in your cmd output:)

Thanks for pointing that out. My apologies — I switched between several driver versions and accidentally overlooked this field.
I am currently using doca-all 2.9.3008, and I can indeed find this field.


I have tried two versions—the latest one and version 2.9.3008—but neither of them has the rx_icrc_chk_dis field. What could be the issue?