forked from Minki/linux
gre: export gre_build_header() function.
This is required for ovs gre module. Signed-off-by: Pravin B Shelar <pshelar@nicira.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
bda7bb4634
commit
752f36da68
@ -32,6 +32,8 @@ struct gre_cisco_protocol {
|
||||
|
||||
int gre_cisco_register(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,
|
||||
int hdr_len);
|
||||
|
||||
static inline int ip_gre_calc_hlen(__be16 o_flags)
|
||||
{
|
||||
|
@ -61,6 +61,38 @@ int gre_del_protocol(const struct gre_protocol *proto, u8 version)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(gre_del_protocol);
|
||||
|
||||
void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi,
|
||||
int hdr_len)
|
||||
{
|
||||
struct gre_base_hdr *greh;
|
||||
|
||||
skb_push(skb, hdr_len);
|
||||
|
||||
greh = (struct gre_base_hdr *)skb->data;
|
||||
greh->flags = tnl_flags_to_gre_flags(tpi->flags);
|
||||
greh->protocol = tpi->proto;
|
||||
|
||||
if (tpi->flags&(TUNNEL_KEY|TUNNEL_CSUM|TUNNEL_SEQ)) {
|
||||
__be32 *ptr = (__be32 *)(((u8 *)greh) + hdr_len - 4);
|
||||
|
||||
if (tpi->flags&TUNNEL_SEQ) {
|
||||
*ptr = tpi->seq;
|
||||
ptr--;
|
||||
}
|
||||
if (tpi->flags&TUNNEL_KEY) {
|
||||
*ptr = tpi->key;
|
||||
ptr--;
|
||||
}
|
||||
if (tpi->flags&TUNNEL_CSUM &&
|
||||
!(skb_shinfo(skb)->gso_type & SKB_GSO_GRE)) {
|
||||
*ptr = 0;
|
||||
*(__sum16 *)ptr = csum_fold(skb_checksum(skb, 0,
|
||||
skb->len, 0));
|
||||
}
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(gre_build_header);
|
||||
|
||||
static __sum16 check_checksum(struct sk_buff *skb)
|
||||
{
|
||||
__sum16 csum = 0;
|
||||
|
@ -248,40 +248,6 @@ error:
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
static struct sk_buff *gre_build_header(struct sk_buff *skb,
|
||||
const struct tnl_ptk_info *tpi,
|
||||
int hdr_len)
|
||||
{
|
||||
struct gre_base_hdr *greh;
|
||||
|
||||
skb_push(skb, hdr_len);
|
||||
|
||||
greh = (struct gre_base_hdr *)skb->data;
|
||||
greh->flags = tnl_flags_to_gre_flags(tpi->flags);
|
||||
greh->protocol = tpi->proto;
|
||||
|
||||
if (tpi->flags&(TUNNEL_KEY|TUNNEL_CSUM|TUNNEL_SEQ)) {
|
||||
__be32 *ptr = (__be32 *)(((u8 *)greh) + hdr_len - 4);
|
||||
|
||||
if (tpi->flags&TUNNEL_SEQ) {
|
||||
*ptr = tpi->seq;
|
||||
ptr--;
|
||||
}
|
||||
if (tpi->flags&TUNNEL_KEY) {
|
||||
*ptr = tpi->key;
|
||||
ptr--;
|
||||
}
|
||||
if (tpi->flags&TUNNEL_CSUM &&
|
||||
!(skb_shinfo(skb)->gso_type & SKB_GSO_GRE)) {
|
||||
*(__sum16 *)ptr = 0;
|
||||
*(__sum16 *)ptr = csum_fold(skb_checksum(skb, 0,
|
||||
skb->len, 0));
|
||||
}
|
||||
}
|
||||
|
||||
return skb;
|
||||
}
|
||||
|
||||
static void __gre_xmit(struct sk_buff *skb, struct net_device *dev,
|
||||
const struct iphdr *tnl_params,
|
||||
__be16 proto)
|
||||
@ -302,11 +268,7 @@ static void __gre_xmit(struct sk_buff *skb, struct net_device *dev,
|
||||
tpi.seq = htonl(tunnel->o_seqno);
|
||||
|
||||
/* Push GRE header. */
|
||||
skb = gre_build_header(skb, &tpi, tunnel->hlen);
|
||||
if (unlikely(!skb)) {
|
||||
dev->stats.tx_dropped++;
|
||||
return;
|
||||
}
|
||||
gre_build_header(skb, &tpi, tunnel->hlen);
|
||||
|
||||
ip_tunnel_xmit(skb, dev, tnl_params, tnl_params->protocol);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user