diff options
author | yongari <yongari@FreeBSD.org> | 2010-02-20 22:47:20 +0000 |
---|---|---|
committer | yongari <yongari@FreeBSD.org> | 2010-02-20 22:47:20 +0000 |
commit | 453676a091f9cfbbcbb1bae93154f6b75893d5c0 (patch) | |
tree | c4b9d0e694a7a33948e8a9870ca49973869188d8 | |
parent | 7772630fb3afe62bfc6b65e13accda35f5633446 (diff) | |
download | FreeBSD-src-453676a091f9cfbbcbb1bae93154f6b75893d5c0.zip FreeBSD-src-453676a091f9cfbbcbb1bae93154f6b75893d5c0.tar.gz |
Add TSO support on VLANs. Intentionally separated IFCAP_VLAN_HWTSO
from IFCAP_VLAN_HWTAGGING. I think some hardwares may be able to
TSO over VLAN without VLAN hardware tagging.
Driver changes and userland support will follow.
Reviewed by: thompsa
-rw-r--r-- | sys/net/if.h | 1 | ||||
-rw-r--r-- | sys/net/if_vlan.c | 17 |
2 files changed, 17 insertions, 1 deletions
diff --git a/sys/net/if.h b/sys/net/if.h index aff0d76..e226654 100644 --- a/sys/net/if.h +++ b/sys/net/if.h @@ -218,6 +218,7 @@ struct if_data { #define IFCAP_TOE6 0x08000 /* interface can offload TCP6 */ #define IFCAP_VLAN_HWFILTER 0x10000 /* interface hw can filter vlan tag */ #define IFCAP_POLLING_NOCOUNT 0x20000 /* polling ticks cannot be fragmented */ +#define IFCAP_VLAN_HWTSO 0x40000 /* can do IFCAP_TSO on VLANs */ #define IFCAP_HWCSUM (IFCAP_RXCSUM | IFCAP_TXCSUM) #define IFCAP_TSO (IFCAP_TSO4 | IFCAP_TSO6) diff --git a/sys/net/if_vlan.c b/sys/net/if_vlan.c index 4b16a9c..959fc5e 100644 --- a/sys/net/if_vlan.c +++ b/sys/net/if_vlan.c @@ -1322,11 +1322,26 @@ vlan_capabilities(struct ifvlan *ifv) if (p->if_capenable & IFCAP_VLAN_HWCSUM && p->if_capenable & IFCAP_VLAN_HWTAGGING) { ifp->if_capenable = p->if_capenable & IFCAP_HWCSUM; - ifp->if_hwassist = p->if_hwassist; + ifp->if_hwassist = p->if_hwassist & (CSUM_IP | CSUM_TCP | + CSUM_UDP | CSUM_SCTP | CSUM_IP_FRAGS | CSUM_FRAGMENT); } else { ifp->if_capenable = 0; ifp->if_hwassist = 0; } + /* + * If the parent interface can do TSO on VLANs then + * propagate the hardware-assisted flag. TSO on VLANs + * does not necessarily require hardware VLAN tagging. + */ + if (p->if_capabilities & IFCAP_VLAN_HWTSO) + ifp->if_capabilities |= p->if_capabilities & IFCAP_TSO; + if (p->if_capenable & IFCAP_VLAN_HWTSO) { + ifp->if_capenable |= p->if_capenable & IFCAP_TSO; + ifp->if_hwassist |= p->if_hwassist & CSUM_TSO; + } else { + ifp->if_capenable &= ~(p->if_capenable & IFCAP_TSO); + ifp->if_hwassist &= ~(p->if_hwassist & CSUM_TSO); + } } static void |