Merge branch 'net-support-sctp-crc-csum-offload-for-tunneling-packets-in-some-drivers'
Xin Long says: ==================== net: support SCTP CRC csum offload for tunneling packets in some drivers This patchset introduces inline function skb_csum_is_sctp(), and uses it to validate it's a sctp CRC csum offload packet, to make SCTP CRC csum offload for tunneling packets supported in some HW drivers. ==================== Link: https://lore.kernel.org/r/cover.1610777159.git.lucien.xin@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
9f23de418f
|
@ -5959,15 +5959,6 @@ static int igb_tso(struct igb_ring *tx_ring,
|
|||
return 1;
|
||||
}
|
||||
|
||||
static inline bool igb_ipv6_csum_is_sctp(struct sk_buff *skb)
|
||||
{
|
||||
unsigned int offset = 0;
|
||||
|
||||
ipv6_find_hdr(skb, &offset, IPPROTO_SCTP, NULL, NULL);
|
||||
|
||||
return offset == skb_checksum_start_offset(skb);
|
||||
}
|
||||
|
||||
static void igb_tx_csum(struct igb_ring *tx_ring, struct igb_tx_buffer *first)
|
||||
{
|
||||
struct sk_buff *skb = first->skb;
|
||||
|
@ -5990,10 +5981,7 @@ csum_failed:
|
|||
break;
|
||||
case offsetof(struct sctphdr, checksum):
|
||||
/* validate that this is actually an SCTP request */
|
||||
if (((first->protocol == htons(ETH_P_IP)) &&
|
||||
(ip_hdr(skb)->protocol == IPPROTO_SCTP)) ||
|
||||
((first->protocol == htons(ETH_P_IPV6)) &&
|
||||
igb_ipv6_csum_is_sctp(skb))) {
|
||||
if (skb_csum_is_sctp(skb)) {
|
||||
type_tucmd = E1000_ADVTXD_TUCMD_L4T_SCTP;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -2072,15 +2072,6 @@ static int igbvf_tso(struct igbvf_ring *tx_ring,
|
|||
return 1;
|
||||
}
|
||||
|
||||
static inline bool igbvf_ipv6_csum_is_sctp(struct sk_buff *skb)
|
||||
{
|
||||
unsigned int offset = 0;
|
||||
|
||||
ipv6_find_hdr(skb, &offset, IPPROTO_SCTP, NULL, NULL);
|
||||
|
||||
return offset == skb_checksum_start_offset(skb);
|
||||
}
|
||||
|
||||
static bool igbvf_tx_csum(struct igbvf_ring *tx_ring, struct sk_buff *skb,
|
||||
u32 tx_flags, __be16 protocol)
|
||||
{
|
||||
|
@ -2102,10 +2093,7 @@ csum_failed:
|
|||
break;
|
||||
case offsetof(struct sctphdr, checksum):
|
||||
/* validate that this is actually an SCTP request */
|
||||
if (((protocol == htons(ETH_P_IP)) &&
|
||||
(ip_hdr(skb)->protocol == IPPROTO_SCTP)) ||
|
||||
((protocol == htons(ETH_P_IPV6)) &&
|
||||
igbvf_ipv6_csum_is_sctp(skb))) {
|
||||
if (skb_csum_is_sctp(skb)) {
|
||||
type_tucmd = E1000_ADVTXD_TUCMD_L4T_SCTP;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -949,15 +949,6 @@ static void igc_tx_ctxtdesc(struct igc_ring *tx_ring,
|
|||
}
|
||||
}
|
||||
|
||||
static inline bool igc_ipv6_csum_is_sctp(struct sk_buff *skb)
|
||||
{
|
||||
unsigned int offset = 0;
|
||||
|
||||
ipv6_find_hdr(skb, &offset, IPPROTO_SCTP, NULL, NULL);
|
||||
|
||||
return offset == skb_checksum_start_offset(skb);
|
||||
}
|
||||
|
||||
static void igc_tx_csum(struct igc_ring *tx_ring, struct igc_tx_buffer *first)
|
||||
{
|
||||
struct sk_buff *skb = first->skb;
|
||||
|
@ -980,10 +971,7 @@ csum_failed:
|
|||
break;
|
||||
case offsetof(struct sctphdr, checksum):
|
||||
/* validate that this is actually an SCTP request */
|
||||
if ((first->protocol == htons(ETH_P_IP) &&
|
||||
(ip_hdr(skb)->protocol == IPPROTO_SCTP)) ||
|
||||
(first->protocol == htons(ETH_P_IPV6) &&
|
||||
igc_ipv6_csum_is_sctp(skb))) {
|
||||
if (skb_csum_is_sctp(skb)) {
|
||||
type_tucmd = IGC_ADVTXD_TUCMD_L4T_SCTP;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -8039,15 +8039,6 @@ static int ixgbe_tso(struct ixgbe_ring *tx_ring,
|
|||
return 1;
|
||||
}
|
||||
|
||||
static inline bool ixgbe_ipv6_csum_is_sctp(struct sk_buff *skb)
|
||||
{
|
||||
unsigned int offset = 0;
|
||||
|
||||
ipv6_find_hdr(skb, &offset, IPPROTO_SCTP, NULL, NULL);
|
||||
|
||||
return offset == skb_checksum_start_offset(skb);
|
||||
}
|
||||
|
||||
static void ixgbe_tx_csum(struct ixgbe_ring *tx_ring,
|
||||
struct ixgbe_tx_buffer *first,
|
||||
struct ixgbe_ipsec_tx_data *itd)
|
||||
|
@ -8073,10 +8064,7 @@ csum_failed:
|
|||
break;
|
||||
case offsetof(struct sctphdr, checksum):
|
||||
/* validate that this is actually an SCTP request */
|
||||
if (((first->protocol == htons(ETH_P_IP)) &&
|
||||
(ip_hdr(skb)->protocol == IPPROTO_SCTP)) ||
|
||||
((first->protocol == htons(ETH_P_IPV6)) &&
|
||||
ixgbe_ipv6_csum_is_sctp(skb))) {
|
||||
if (skb_csum_is_sctp(skb)) {
|
||||
type_tucmd = IXGBE_ADVTXD_TUCMD_L4T_SCTP;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -3843,15 +3843,6 @@ static int ixgbevf_tso(struct ixgbevf_ring *tx_ring,
|
|||
return 1;
|
||||
}
|
||||
|
||||
static inline bool ixgbevf_ipv6_csum_is_sctp(struct sk_buff *skb)
|
||||
{
|
||||
unsigned int offset = 0;
|
||||
|
||||
ipv6_find_hdr(skb, &offset, IPPROTO_SCTP, NULL, NULL);
|
||||
|
||||
return offset == skb_checksum_start_offset(skb);
|
||||
}
|
||||
|
||||
static void ixgbevf_tx_csum(struct ixgbevf_ring *tx_ring,
|
||||
struct ixgbevf_tx_buffer *first,
|
||||
struct ixgbevf_ipsec_tx_data *itd)
|
||||
|
@ -3872,10 +3863,7 @@ static void ixgbevf_tx_csum(struct ixgbevf_ring *tx_ring,
|
|||
break;
|
||||
case offsetof(struct sctphdr, checksum):
|
||||
/* validate that this is actually an SCTP request */
|
||||
if (((first->protocol == htons(ETH_P_IP)) &&
|
||||
(ip_hdr(skb)->protocol == IPPROTO_SCTP)) ||
|
||||
((first->protocol == htons(ETH_P_IPV6)) &&
|
||||
ixgbevf_ipv6_csum_is_sctp(skb))) {
|
||||
if (skb_csum_is_sctp(skb)) {
|
||||
type_tucmd = IXGBE_ADVTXD_TUCMD_L4T_SCTP;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -979,7 +979,7 @@ static int ionic_tx_calc_csum(struct ionic_queue *q, struct sk_buff *skb)
|
|||
stats->vlan_inserted++;
|
||||
}
|
||||
|
||||
if (skb->csum_not_inet)
|
||||
if (skb_csum_is_sctp(skb))
|
||||
stats->crc32_csum++;
|
||||
else
|
||||
stats->csum++;
|
||||
|
|
|
@ -4621,6 +4621,11 @@ static inline void skb_reset_redirect(struct sk_buff *skb)
|
|||
#endif
|
||||
}
|
||||
|
||||
static inline bool skb_csum_is_sctp(struct sk_buff *skb)
|
||||
{
|
||||
return skb->csum_not_inet;
|
||||
}
|
||||
|
||||
static inline void skb_set_kcov_handle(struct sk_buff *skb,
|
||||
const u64 kcov_handle)
|
||||
{
|
||||
|
|
|
@ -3617,7 +3617,7 @@ static struct sk_buff *validate_xmit_vlan(struct sk_buff *skb,
|
|||
int skb_csum_hwoffload_help(struct sk_buff *skb,
|
||||
const netdev_features_t features)
|
||||
{
|
||||
if (unlikely(skb->csum_not_inet))
|
||||
if (unlikely(skb_csum_is_sctp(skb)))
|
||||
return !!(features & NETIF_F_SCTP_CRC) ? 0 :
|
||||
skb_crc32c_csum_help(skb);
|
||||
|
||||
|
|
Loading…
Reference in New Issue