gre: export gre_handle_offloads() function.
This is required for OVS GRE offloading. Signed-off-by: Pravin B Shelar <pshelar@nicira.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
752f36da68
commit
45f2e9976c
@ -34,6 +34,7 @@ int gre_cisco_register(struct gre_cisco_protocol *proto);
|
|||||||
int gre_cisco_unregister(struct gre_cisco_protocol *proto);
|
int gre_cisco_unregister(struct gre_cisco_protocol *proto);
|
||||||
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 int ip_gre_calc_hlen(__be16 o_flags)
|
static inline int ip_gre_calc_hlen(__be16 o_flags)
|
||||||
{
|
{
|
||||||
|
@ -93,6 +93,35 @@ 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;
|
||||||
|
@ -223,31 +223,6 @@ static int ipgre_rcv(struct sk_buff *skb, const struct tnl_ptk_info *tpi)
|
|||||||
return PACKET_REJECT;
|
return PACKET_REJECT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sk_buff *handle_offloads(struct ip_tunnel *tunnel, struct sk_buff *skb)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
|
|
||||||
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 &&
|
|
||||||
tunnel->parms.o_flags&TUNNEL_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);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __gre_xmit(struct sk_buff *skb, struct net_device *dev,
|
static void __gre_xmit(struct sk_buff *skb, struct net_device *dev,
|
||||||
const struct iphdr *tnl_params,
|
const struct iphdr *tnl_params,
|
||||||
__be16 proto)
|
__be16 proto)
|
||||||
@ -255,11 +230,6 @@ static void __gre_xmit(struct sk_buff *skb, struct net_device *dev,
|
|||||||
struct ip_tunnel *tunnel = netdev_priv(dev);
|
struct ip_tunnel *tunnel = netdev_priv(dev);
|
||||||
struct tnl_ptk_info tpi;
|
struct tnl_ptk_info tpi;
|
||||||
|
|
||||||
if (likely(!skb->encapsulation)) {
|
|
||||||
skb_reset_inner_headers(skb);
|
|
||||||
skb->encapsulation = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
tpi.flags = tunnel->parms.o_flags;
|
tpi.flags = tunnel->parms.o_flags;
|
||||||
tpi.proto = proto;
|
tpi.proto = proto;
|
||||||
tpi.key = tunnel->parms.o_key;
|
tpi.key = tunnel->parms.o_key;
|
||||||
@ -279,7 +249,7 @@ static netdev_tx_t ipgre_xmit(struct sk_buff *skb,
|
|||||||
struct ip_tunnel *tunnel = netdev_priv(dev);
|
struct ip_tunnel *tunnel = netdev_priv(dev);
|
||||||
const struct iphdr *tnl_params;
|
const struct iphdr *tnl_params;
|
||||||
|
|
||||||
skb = handle_offloads(tunnel, skb);
|
skb = gre_handle_offloads(skb, !!(tunnel->parms.o_flags&TUNNEL_CSUM));
|
||||||
if (IS_ERR(skb))
|
if (IS_ERR(skb))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
@ -318,7 +288,7 @@ static netdev_tx_t gre_tap_xmit(struct sk_buff *skb,
|
|||||||
{
|
{
|
||||||
struct ip_tunnel *tunnel = netdev_priv(dev);
|
struct ip_tunnel *tunnel = netdev_priv(dev);
|
||||||
|
|
||||||
skb = handle_offloads(tunnel, skb);
|
skb = gre_handle_offloads(skb, !!(tunnel->parms.o_flags&TUNNEL_CSUM));
|
||||||
if (IS_ERR(skb))
|
if (IS_ERR(skb))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user