ipv4: generalize gre_handle_offloads
This patch makes gre_handle_offloads() more generic and rename it to iptunnel_handle_offloads() This will be used to add GSO/TSO support to IPIP tunnels. Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
030737bcc3
commit
2d26f0a3c0
@@ -38,7 +38,13 @@ void gre_offload_exit(void);
|
|||||||
|
|
||||||
void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi,
|
void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi,
|
||||||
int hdr_len);
|
int hdr_len);
|
||||||
struct sk_buff *gre_handle_offloads(struct sk_buff *skb, bool gre_csum);
|
|
||||||
|
static inline struct sk_buff *gre_handle_offloads(struct sk_buff *skb,
|
||||||
|
bool gre_csum)
|
||||||
|
{
|
||||||
|
return iptunnel_handle_offloads(skb, gre_csum, SKB_GSO_GRE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline int ip_gre_calc_hlen(__be16 o_flags)
|
static inline int ip_gre_calc_hlen(__be16 o_flags)
|
||||||
{
|
{
|
||||||
|
@@ -150,6 +150,9 @@ int iptunnel_xmit(struct rtable *rt, struct sk_buff *skb,
|
|||||||
__be32 src, __be32 dst, __u8 proto,
|
__be32 src, __be32 dst, __u8 proto,
|
||||||
__u8 tos, __u8 ttl, __be16 df, bool xnet);
|
__u8 tos, __u8 ttl, __be16 df, bool xnet);
|
||||||
|
|
||||||
|
struct sk_buff *iptunnel_handle_offloads(struct sk_buff *skb, bool gre_csum,
|
||||||
|
int gso_type_mask);
|
||||||
|
|
||||||
static inline void iptunnel_xmit_stats(int err,
|
static inline void iptunnel_xmit_stats(int err,
|
||||||
struct net_device_stats *err_stats,
|
struct net_device_stats *err_stats,
|
||||||
struct pcpu_tstats __percpu *stats)
|
struct pcpu_tstats __percpu *stats)
|
||||||
|
@@ -93,35 +93,6 @@ void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(gre_build_header);
|
EXPORT_SYMBOL_GPL(gre_build_header);
|
||||||
|
|
||||||
struct sk_buff *gre_handle_offloads(struct sk_buff *skb, bool gre_csum)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
|
|
||||||
if (likely(!skb->encapsulation)) {
|
|
||||||
skb_reset_inner_headers(skb);
|
|
||||||
skb->encapsulation = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (skb_is_gso(skb)) {
|
|
||||||
err = skb_unclone(skb, GFP_ATOMIC);
|
|
||||||
if (unlikely(err))
|
|
||||||
goto error;
|
|
||||||
skb_shinfo(skb)->gso_type |= SKB_GSO_GRE;
|
|
||||||
return skb;
|
|
||||||
} else if (skb->ip_summed == CHECKSUM_PARTIAL && gre_csum) {
|
|
||||||
err = skb_checksum_help(skb);
|
|
||||||
if (unlikely(err))
|
|
||||||
goto error;
|
|
||||||
} else if (skb->ip_summed != CHECKSUM_PARTIAL)
|
|
||||||
skb->ip_summed = CHECKSUM_NONE;
|
|
||||||
|
|
||||||
return skb;
|
|
||||||
error:
|
|
||||||
kfree_skb(skb);
|
|
||||||
return ERR_PTR(err);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(gre_handle_offloads);
|
|
||||||
|
|
||||||
static __sum16 check_checksum(struct sk_buff *skb)
|
static __sum16 check_checksum(struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
__sum16 csum = 0;
|
__sum16 csum = 0;
|
||||||
|
@@ -116,3 +116,36 @@ int iptunnel_pull_header(struct sk_buff *skb, int hdr_len, __be16 inner_proto)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(iptunnel_pull_header);
|
EXPORT_SYMBOL_GPL(iptunnel_pull_header);
|
||||||
|
|
||||||
|
struct sk_buff *iptunnel_handle_offloads(struct sk_buff *skb,
|
||||||
|
bool csum_help,
|
||||||
|
int gso_type_mask)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if (likely(!skb->encapsulation)) {
|
||||||
|
skb_reset_inner_headers(skb);
|
||||||
|
skb->encapsulation = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (skb_is_gso(skb)) {
|
||||||
|
err = skb_unclone(skb, GFP_ATOMIC);
|
||||||
|
if (unlikely(err))
|
||||||
|
goto error;
|
||||||
|
skb_shinfo(skb)->gso_type |= gso_type_mask;
|
||||||
|
return skb;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (skb->ip_summed == CHECKSUM_PARTIAL && csum_help) {
|
||||||
|
err = skb_checksum_help(skb);
|
||||||
|
if (unlikely(err))
|
||||||
|
goto error;
|
||||||
|
} else if (skb->ip_summed != CHECKSUM_PARTIAL)
|
||||||
|
skb->ip_summed = CHECKSUM_NONE;
|
||||||
|
|
||||||
|
return skb;
|
||||||
|
error:
|
||||||
|
kfree_skb(skb);
|
||||||
|
return ERR_PTR(err);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(iptunnel_handle_offloads);
|
||||||
|
Reference in New Issue
Block a user