diff --git a/share/man/man4/bge.4 b/share/man/man4/bge.4 --- a/share/man/man4/bge.4 +++ b/share/man/man4/bge.4 @@ -29,7 +29,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF .\" THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd August 18, 2017 +.Dd January 16, 2026 .Dt BGE 4 .Os .Sh NAME @@ -276,3 +276,11 @@ while the system is up as the kernel is currently unable to cope with a .Nm interface disappearing. +.Pp +The UDP transmit checksum offloading is disabled by default, see +.Va dev.bge.%d.forced_udpcsum . +To avoid problems when the interface is a member of a +.Xr bridge 4 +interface, all transmit checksum offloading is initially disabled in this case. +Transmit checksum offloading can be enabled using +.Xr ifconfig 8 . diff --git a/sys/dev/bge/if_bge.c b/sys/dev/bge/if_bge.c --- a/sys/dev/bge/if_bge.c +++ b/sys/dev/bge/if_bge.c @@ -3721,7 +3721,12 @@ if_setgetcounterfn(ifp, bge_get_counter); if_setsendqlen(ifp, BGE_TX_RING_CNT - 1); if_setsendqready(ifp); - if_sethwassist(ifp, sc->bge_csum_features); + /* Initially enable checksum offloading either for all of IPv4, TCP/IPv4 + * and UDP/IPv4, or for none. This avoids problems when the interface + * is added to a bridge. + */ + if (sc->bge_csum_features & CSUM_UDP) + if_sethwassist(ifp, sc->bge_csum_features); if_setcapabilities(ifp, IFCAP_HWCSUM | IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU); if ((sc->bge_flags & (BGE_FLAG_TSO | BGE_FLAG_TSO3)) != 0) { @@ -3732,6 +3737,13 @@ if_setcapabilitiesbit(ifp, IFCAP_VLAN_HWCSUM, 0); #endif if_setcapenable(ifp, if_getcapabilities(ifp)); + /* + * Disable TXCSUM capability initially, if UDP checksum offloading is + * not enabled. This avoids problems when the interface is added to a + * bridge. + */ + if ((sc->bge_csum_features & CSUM_UDP) == 0) + if_setcapenablebit(ifp, 0, IFCAP_TXCSUM); #ifdef DEVICE_POLLING if_setcapabilitiesbit(ifp, IFCAP_POLLING, 0); #endif